所以我有一个名为arr
的数组。
我想用四个随机数填充它:
for (var i = 0; i < 4; i++) {
arr[i] = Math.floor(Math.random() * 10);
}
如果返回值为[4, 2, 3, 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);
}