使用非重复随机数填充数组

时间:2016-05-01 01:24:23

标签: javascript arrays

所以我有一个名为arr的数组。

我想用四个随机数填充它:

for (var i = 0; i < 4; i++) {
  arr[i] = Math.floor(Math.random() * 10);
}

如果返回值为[4, 2, 3, 4]的数组。如何检查重复项,并重新计算与数组中已存在的任何其他值不相等的随机数?

此外,如果有更好的方法来实现这一点,我也很乐意学习/了解这种方式。

4 个答案:

答案 0 :(得分:3)

  

此外,如果有更好的方法来实现这一点,我也很乐意学习/了解这种方式。

有。

如果您需要唯一值,请生成常规顺序数组[1,2,3,4](或者您需要多长时间),然后依次使用它来填充第二个数组从第一个数组中提取随机元素(从而增长数组2,并缩小数组1):

var a1 = [];
for (var i=0; i<4; i++) { a1.push(i); }
var a2 = [];
while (a1.length) {
  var pos = Math.random()*a1.length;
  var element = a1.splice(pos, 1)[0];
  a2.push(element);
}
// a2 is now an array with a random permutation of the elements of a1

splice调用从位置pos开始删除一个子数组(在本例中为1个元素),因此a1越来越短,直到它为空,哪个点a2将是唯一值的置换数组。

如果我们从a1 = [0,1,2,3]开始,那么在此次运行之后a2可以是24个可能的序列中的任何一个,并且保证唯一值,因为这是我们开始的,只是以随机顺序。

答案 1 :(得分:1)

您正在寻找的是从整数数组[0..9]中获取随机样本的方法。您可以使用多种算法执行此操作,例如简单的reservoir sampling算法。

答案 2 :(得分:1)

如果你想让一个数组包含随机顺序从1到n的任意数量的数字,我认为更可行的方法是生成一个数字从1到n的数组,然后按照{{{{ 3}}

然后,您可以在洗牌后继续拼接数组,将其缩短到所需的长度。

这两个步骤都具有O(1)或O(n)的复杂性,这比测试每个插入或修改从中绘制数字的值池要好得多。

答案 3 :(得分:0)

我可能会为循环创建一个函数。

function getNumber(arr){
   var num = Math.floor(Math.random() * 10);
   if(arr.indexOf(num) < 0){
      return num;
   } else {
      getNumber(arr);
   };
};

然后你会这样做:

var arr = [];
for (var i = 0; i < 4; i++) {
  arr[i] = getNumber(arr);
}