Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用不重复的随机数填充数组_Javascript_Arrays - Fatal编程技术网

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

Javascript 用不重复的随机数填充数组,javascript,arrays,Javascript,Arrays,因此,我有一个名为arr的数组 我想用四个随机数填充它: for (var i = 0; i < 4; i++) { arr[i] = Math.floor(Math.random() * 10); } for(变量i=0;i

因此,我有一个名为
arr
的数组

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

for (var i = 0; i < 4; i++) {
  arr[i] = Math.floor(Math.random() * 10);
}
for(变量i=0;i<4;i++){
arr[i]=Math.floor(Math.random()*10);
}
如果返回值
[4、2、3、4]
。如何检查重复项,并重新计算不等于数组中已存在的任何其他值的随机数


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

你们要寻找的是一种从整数数组[0..9]中随机抽取样本的方法。您可以使用几种算法来实现这一点,例如一种简单的算法

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

如果需要唯一值,请生成一个规则的顺序数组[1,2,3,4](或所需的长度),然后使用该数组填充第二个数组,方法是依次从第一个数组中提取随机元素(从而增加数组2,缩小数组1):

var a1=[];

对于(var i=0;i如果你想要一个数组,它包含任意数量的从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);
   };
};
函数getNumber(arr){
var num=Math.floor(Math.random()*10);
if(arr.indexOf(num)<0){
返回num;
}否则{
getNumber(arr);
};
};
然后你会做:

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

Hi,我只想指出,这个解决方案不是很有效。如果你要生成大型阵列,这个解决方案需要
O(N^2)
时间,而最佳的是
O(N)
。如果没有指向其他解决方案的链接,这不是一个非常有用的说法,因为已经在SO或整个web上=)实际上,作为一个O(N²)算法您不希望对长序列使用该算法,但“long”是相对的;在我的电脑上,数字是1000~10ms和10000~80ms,这两个数字都可以说是如此之大,以至于你不想编写自己的代码,但你只想使用组合数学库,因为你在“任意数据”的土地上。我相信LWCRIS和我自己的答案都是
O(N)
算法,与此相反,它是
O(N^2)
。这个问题问的是实际的操作方式,而不是图书馆:)
var arr = [];
for (var i = 0; i < 4; i++) {
  arr[i] = getNumber(arr);
}