Javascript 创建X数量为一个字符的二维数组
我的目标是在Javascript中创建一个随机生成的2D数组,该数组的X值等于一个字符的值,而其余的值等于另一个字符的值 在本例中,二维阵列有10行10列。数组可能的100个值中有20个应等于“Y”(表示是),其他80个应等于“N”(表示否)。我想在整个数组中随机放置Y,我绝对需要其中20个是Y,其余的是N 我以前有一种效率较低的方法,我想尝试一下这种方法,在我定义数组之后,我将第一个X数量的值设为“Y”,然后将其余的都设为“N”。然后我洗牌数组(使用下划线库中的洗牌),以便“Y”都随机地分布在任何地方 这是一种有效的方式来完成我需要的事情吗?有没有更好的解决办法?我试着用我的示例制作一个JSFIDLE,但该站点目前似乎已关闭 (我无法测试我的代码,看洗牌是否在我的2D数组上正确工作)Javascript 创建X数量为一个字符的二维数组,javascript,arrays,multidimensional-array,shuffle,Javascript,Arrays,Multidimensional Array,Shuffle,我的目标是在Javascript中创建一个随机生成的2D数组,该数组的X值等于一个字符的值,而其余的值等于另一个字符的值 在本例中,二维阵列有10行10列。数组可能的100个值中有20个应等于“Y”(表示是),其他80个应等于“N”(表示否)。我想在整个数组中随机放置Y,我绝对需要其中20个是Y,其余的是N 我以前有一种效率较低的方法,我想尝试一下这种方法,在我定义数组之后,我将第一个X数量的值设为“Y”,然后将其余的都设为“N”。然后我洗牌数组(使用下划线库中的洗牌),以便“Y”都随机地分布在
var行=10;
var-cols=10;
var元素=20;
//定义空数组
var测试=新数组(行);
对于(var k=0;k 如果(i洗牌多维数组不是最好的方法。因为任何排序都比线性时间复杂度差。最简单的解决方案是创建多维数组,然后将每个索引值设置为希望“其余”值的字符。然后对于1->其他字符值的数量,选择一个随机索引,然后把它换成字符
注意:如果随机选取的点已被更改,则需要选择一个新的点,以确保最后的数量正确。洗牌多维数组不是最佳方法。因为任何排序都比线性时间复杂度差。最简单的解决方案是创建多维数组,然后设置每个索引值都指向您希望“其余”值的字符。然后对于1->其他字符值的数量,选择一个随机索引并将其设置为字符
注意:如果随机选取的点已被更改,则需要选择一个新的点,以确保最后的数量正确。您可以尝试此解决方案,它使用下划线范围创建一对数组,用作迭代器,尽管它们的值无关紧要
使用随机化器函数获得“y”的均匀分布
JSBIN:
var行=u0.range(0,10,0);
变量列=u0.range(0,10,0);
函数随机化器(mult){
返回Math.floor((Math.random()*mult)+1);
}
变量y_计数=0;
var matrix=u2;.map(行,函数(){
返回映射(列、函数(v、i){
var值;
允许的变量y_=随机化器(3);
无功电流_y_计数=0;
如果(y_计数<20&&当前y_计数<允许y_){
var rand=随机化器(5);
如果(兰德>4){
值='y';
当前_y_计数++;
y_计数++;
}
}
如果(!值){
值='n';
}
返回值;
});
});
//上述情况可以简化为:
var矩阵=u.range(0,10,0).map(函数(){
返回范围(0,10,0).map(函数(){
//把上面的逻辑代码放在这里
});
});
您可以尝试此解决方案,它使用下划线范围创建一对数组用作迭代器,尽管它们的值无关紧要
使用随机化器函数获得“y”的均匀分布
JSBIN:
var行=u0.range(0,10,0);
变量列=u0.range(0,10,0);
函数随机化器(mult){
返回Math.floor((Math.random()*mult)+1);
}
变量y_计数=0;
var matrix=u2;.map(行,函数(){
返回映射(列、函数(v、i){
var值;
允许的变量y_=随机化器(3);
无功电流_y_计数=0;
如果(y_计数<20&&当前y_计数<允许y_){
var rand=随机化器(5);
如果(兰德>4){
值='y';
当前_y_计数++;
y_计数++;
}
}
如果(!值){
值='n';
}
返回值;
});
});
//上述情况可以简化为:
var矩阵=u.range(0,10,0).map(函数(){
返回范围(0,10,0).map(函数(){
//把上面的逻辑代码放在这里
});
});
也许二维数组不是最好的方法。正如@Zeb提到的,这里有一些代码用“Y”值填充随机位置。然后,其他位置用“N”填充
var arr=[];
var-cols=10;
var行=10;
变量位置=行*cols;//100
var YQty=10;//只需要10个“Y”
//“Y”值。
对于(i=0;i
也许二维数组不是最好的方法。正如@Zeb提到的,这里有一些代码用“Y”值填充随机位置。然后,其他位置用“N”填充
var arr=[];
var-cols=10;
var行=10;
变量位置=行*cols;//100
var YQty=10;//只需要10个“Y”
//“Y”值。
对于(i=0;ivar rows = 10;
var cols = 10;
var elements = 20;
//Define Empty Array
var test = new Array(rows);
for (var k = 0; k < rows; k++)
{
test[k] = Array(cols);
}
var i = 1;
for (var x = 0; x < rows; x++)
{
for (var y = 0; y < cols; y++)
{
if (i <= elements)
{
test[x][y] = "Y";
}
else
{
test[x][y] = "N";
}
}
}
//Shuffle all those values so they're no longer in order
var shuffledTest = _.shuffle(test);
//Print in rows
for (var x = 0; x < rows; x++)
{
console.log(shuffledTest[x]);
}
var rows = _.range(0, 10, 0);
var columns = _.range(0, 10, 0);
function randomizer(mult){
return Math.floor((Math.random()*mult)+1);
}
var y_count = 0;
var matrix = _.map(rows, function(){
return _.map(columns, function(v, i){
var value;
var y_allowed = randomizer(3);
var current_y_count = 0;
if(y_count < 20 && current_y_count < y_allowed){
var rand = randomizer(5);
if(rand > 4){
value = 'y';
current_y_count++;
y_count++;
}
}
if(!value){
value = 'n';
}
return value;
});
});
//The above could be simplified to
var matrix = _.range(0,10,0).map(function(){
return _.range(0,10,0).map(function(){
//put the logic code from above here
});
});
var arr = [];
var cols = 10;
var rows = 10;
var positions = rows*cols; // 100
var YQty = 10; // only 10 'Y' are needed
// 'Y' values.
for(i = 0; i < YQty; i++)
{
do
{
x = parseInt(Math.random() * cols);
y = parseInt(Math.random() * rows);
filled = false;
if (typeof(arr[x]) == "undefined")
{
arr[x] = [];
}
if (typeof(arr[x][y]) == "undefined")
{
arr[x][y] = 'Y';
filled = true;
}
}
while (!filled);
}
// 'N' values.
for (x = 0; x < cols; x++)
{
if (typeof(arr[x]) == "undefined")
{
arr[x] = [];
}
for (y = 0; y < rows; y++)
{
if (arr[x][y] != 'Y')
{
arr[x][y] = 'N';
}
}
}
var tmpArr = [], // Temporary 1-dimensional array to hold all values
arr = [], // The final 2-dimensional array
rows = 10,
cols = 10,
elements = 20; // Number of "Y"s
// 1. Fill temporary array with "N"s
for (var i = 0; i < rows * cols - elements; i += 1) {
tmpArr.push("N");
}
// 2. Insert "Y"s at random indexes in the temporary array
for (var i = 0; i < elements; i += 1) {
var index = Math.round(Math.random() * (tmpArr.length + 1));
tmpArr.splice(index, 0, "Y");
}
// 3. Split temporary array into 10 seperate arrays
// and insert them into the final array
for (var i = 0; i < rows; i += 1) {
var row = tmpArr.slice(i * cols, (i + 1) * cols);
arr.push(row);
}