Javascript 创建X数量为一个字符的二维数组

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”都随机地分布在

我的目标是在Javascript中创建一个随机生成的2D数组,该数组的X值等于一个字符的值,而其余的值等于另一个字符的值

在本例中,二维阵列有10行10列。数组可能的100个值中有20个应等于“Y”(表示是),其他80个应等于“N”(表示否)。我想在整个数组中随机放置Y,我绝对需要其中20个是Y,其余的是N

我以前有一种效率较低的方法,我想尝试一下这种方法,在我定义数组之后,我将第一个X数量的值设为“Y”,然后将其余的都设为“N”。然后我洗牌数组(使用下划线库中的洗牌),以便“Y”都随机地分布在任何地方

这是一种有效的方式来完成我需要的事情吗?有没有更好的解决办法?我试着用我的示例制作一个JSFIDLE,但该站点目前似乎已关闭

(我无法测试我的代码,看洗牌是否在我的2D数组上正确工作)

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);
}