我需要在1到20之间生成30
个随机数。我正在使用此代码,但由于循环数大于随机范围(我猜!)这会产生冲突。
var arr1 = [];
for (var i = 0; i < 30;) {
var ran = Math.floor(Math.random() * 20) + 1;
if ( arr1.indexOf(ran) == -1)
arr1[i++] = ran;
}
你可以告诉我为什么会这样,以及如何防止这种情况造成30个随机数?
由于
答案 0 :(得分:2)
我在这里创造了一个小提琴,看看
https://jsbin.com/kagixi/edit?html,js,output
在第一种情况下,我们通过迭代所有索引来更新值。
var list = new Array(30).fill(0);
list.forEach(function(d, index){
list[index] = Math.floor(Math.random() * 20) + 1;
});
console.log(list);
另一种方法是将数组初始化为循环,然后简单地创建一个具有相同长度的新数组,或者像我在本例中所做的那样替换现有数组。
var list2 = new Array(30).fill(0);
list2 = list2.map(function(){
return Math.floor(Math.random() * 20) + 1;
});
答案 1 :(得分:1)
你错过了你陈述的第三个论点。 试试这个:
var arr1 = [];
for (var i = 0; i < 30; i++) {
arr1[i] = Math.floor(Math.random() * 20) + 1;
}
答案 2 :(得分:0)
您的代码会创建一个无限循环。
您的随机数介于1到20之间,但您希望阵列中有30个。检查行if ( arr1.indexOf(ran) == -1)
中的重复项,保证在20次迭代后返回false,从而创建无限循环。