Javascript 产生随机数多于随机数的问题

Javascript 产生随机数多于随机数的问题,javascript,jquery,Javascript,Jquery,我需要生成介于1到20之间的30随机数。我正在使用这段代码,但这会产生冲突,因为循环数大于随机范围(我猜!) var arr1=[]; 对于(var i=0;i

我需要生成介于1到20之间的
30
随机数。我正在使用这段代码,但这会产生冲突,因为循环数大于随机范围(我猜!)

var arr1=[];
对于(var i=0;i<30;){
var ran=Math.floor(Math.random()*20)+1;
if(arr1.indexOf(ran)=-1)
arr1[i++]=ran;
}
你能告诉我为什么会发生这种情况,以及我如何防止这种情况产生30个随机数吗


谢谢

我在这里做了一把小提琴,看一看

在第一种情况下,我们通过迭代所有索引来更新值

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

我在这里做了一把小提琴,看一看

在第一种情况下,我们通过迭代所有索引来更新值

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

您错过了for声明中的第三个论点。 试试这个:

var arr1 = [];
for (var i = 0; i < 30; i++) {
    arr1[i] = Math.floor(Math.random() * 20) + 1;
}
var arr1=[];
对于(变量i=0;i<30;i++){
arr1[i]=Math.floor(Math.random()*20)+1;
}

您错过了for语句中的第三个参数。 试试这个:

var arr1 = [];
for (var i = 0; i < 30; i++) {
    arr1[i] = Math.floor(Math.random() * 20) + 1;
}
var arr1=[];
对于(变量i=0;i<30;i++){
arr1[i]=Math.floor(Math.random()*20)+1;
}

您的代码创建了一个无限循环


您的随机数介于1和20之间,但您希望数组中有30个随机数。如果(arr1.indexOf(ran)==-1)行中重复项的检查保证在20次迭代后返回false,从而创建一个无限循环

您的代码创建了一个无限循环


您的随机数介于1和20之间,但您希望数组中有30个随机数。如果(arr1.indexOf(ran)==-1)行中重复项的检查保证在20次迭代后返回false,从而创建一个无限循环

不,他的代码没有创建无限循环,他正在增加索引
arr1[i++]=ran这将根据需要中断循环..您试过运行代码吗?我运行它,遇到了一个无限循环。问题是,他想要30个元素,但只有20个可能的数字。不可能有一个包含30个唯一元素和20个候选元素的数组。好吧,这就是他的原始代码所做的。不,他的代码不会创建无限循环,他正在递增索引
arr1[i++]=ran这将根据需要中断循环..您试过运行代码吗?我运行它,遇到了一个无限循环。问题是,他想要30个元素,但只有20个可能的数字。不可能有一个包含30个唯一元素和20个候选元素的数组。好吧,这就是他的原始代码所做的