在多维数组中随机获取所有数字1-400

时间:2015-06-01 22:05:40

标签: javascript arrays multidimensional-array

我试图在多维数组中列出1-400之间的所有数字。

我不想要任何重复的数字(1只会在数组中一次,18,100,385等等)我不希望这些数字完全按顺序排列,我想要它们在随机位置放置在数组中..

示例(我是从1-10手工制作的):

    var pairs =[
         [3, 9],
         [6, 4],
         [2, 1],
         [5, 8],
         [7, 10],

         //... and up to
         [185, 400]
    ]

那么,有没有办法让javascript自动创建一个这样的数组,但更大的数字呢? 谢谢你的帮助!

3 个答案:

答案 0 :(得分:5)

您可以使用标准 Fisher-Yates shuffle 算法,如下所示:

function generateRandomPairs(numberOfPairs)
{
  var i, j, numbers, tmp, pairs;

  // fill array
  numbers = [];
  for (i = 0; i < numberOfPairs * 2; i++)
  {
    numbers[i] = i + 1;
  }

  // randomize array really good
  for (i = 0; i < numberOfPairs * 2 - 1; i++)
  {
    j = Math.floor(Math.random() * (numberOfPairs * 2 - i)) + i;
    // swap element i with element j
    tmp = numbers[i];
    numbers[i] = numbers[j];
    numbers[j] = tmp;
  }

  // transform linear array to pairs
  pairs = [];
  for (i = 0; i < numberOfPairs * 2; i += 2)
  {
    pairs.push([ numbers[i], numbers[i + 1] ]);
  }

  return pairs;
}

答案 1 :(得分:2)

  1. 使用1到400
  2. 的数字填充一维数组
  3. 将数组洗牌(例如使用Fisher-Yates shuffle
  4. 将1维数组的元素复制到多维数组中

答案 2 :(得分:0)

试试这个:

function range(from, to){
  for(var i=0,n=from,r=[]; n<=to; i++,n++){
    r[i] = n;
  }
  return r;
}
function shuffle(array){
  for(var i=0,l=array.length,n,t,r=[]; i<l; i++){
    n = Math.floor(Math.random()*(i+1)); t = array[i]; r[i] = array[n]; r[n] = t;
  }
  return r;
}
function randPairsFromRange(rangeArray){
  var l = rangeArray.length;
  if(l % 2 !== 0){
    return false;
  }
  for(var i=0,n=1,s=shuffle(rangeArray),r=[]; i<l; i+=2,n+=2){
    r.push([s[i], s[n]]);
  }
  return r;
}
console.log(randPairsFromRange(range(1,400)));