用不重复的随机数填充数组

Populate array with non repeating random numbers

本文关键字:随机数 填充 数组      更新时间:2023-09-26

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

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

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

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

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

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

有。

如果你需要唯一的值,生成一个规则的序列数组[1,2,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个可能序列中的任何一个,具有保证的唯一值,因为这就是我们开始的,只是以随机顺序。

您正在寻找的是一种从整数数组[0..9]中随机采样的方法。您可以使用几种算法来实现这一点,例如一种简单的储层采样算法。

如果您想要一个数组,它包含从1到n的任意数量的随机数字,我认为更可行的方法是生成一个包含从1至n的所有数字的数组,然后按照此处所述对其进行混洗。

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

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

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

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