创建一个包含随机值的数组。

170
24个回答

0

我需要的东西与这些解决方案略有不同,因为我需要创建一个包含指定范围内多个不同随机数的数组。以下是我的解决方案。

function getDistinctRandomIntForArray(array, range){
   var n = Math.floor((Math.random() * range));
   if(array.indexOf(n) == -1){        
    return n; 
   } else {
    return getDistinctRandomIntForArray(array, range); 
   }
}

function generateArrayOfRandomInts(count, range) {
   var array = []; 
   for (i=0; i<count; ++i){
    array[i] = getDistinctRandomIntForArray(array, range);
   };
   return array; 
}

我本来更喜欢不创建一个循环,因为它可能会产生大量不必要的调用(如果您的计数和范围很高并且接近相同的数字),但这是我能想到的最好的方法。


0
有点晚了,但我使用randojs.com来生成随机数,因为它使得这样的事情变得超级简单。你可以像这样轻松地获得一个从0到39的随机打乱的数字数组:

console.log(randoSequence(40));
<script src="https://randojs.com/1.0.0.js"></script>

没有所有物流上的麻烦 - 而且它非常易读和易懂 :)


0

生成器

一个长度为40的数组,包含40个可能的随机值(0-39),且没有重复值,最好像@Phrogz和@Jared Beck所解释的那样对其进行洗牌。 另一种方法,仅供记录,可以使用生成器。但是与其他提出的解决方案相比,这种方法缺乏性能

function* generateRandomIterable(n, range) {
  for (let i = 0; i < n; i++) {
    yield ~~(Math.random() * range);
  }
}
const randomArr = [...generateRandomIterable(40,40)];

0
这是一个ES6函数,它允许设置最小值和最大值,并生成一个包含从最小值到最大值之间所有数字的随机顺序唯一值数组:
const createRandomNumbers = (min, max) => {
  const randomNumbers = new Set()
  const range = max - min + 1

  while (randomNumbers.size < range) {
    randomNumbers.add(~~(Math.random() * range))
  }

  return [...randomNumbers]
}

很好地使用了Set()来保持唯一性,但是:(1)需要在add()中添加“+min”,以及(2)如果范围很大,循环会随着数组填充而不断迭代,并且可能在最后的数字上花费很长时间。 - royappa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接