Javascript 如何使随机数发生器不产生相同的数两次

Javascript 如何使随机数发生器不产生相同的数两次,javascript,random,numbers,Javascript,Random,Numbers,我对编程相当陌生,我一直在做一个项目,找到四个随机div并向其中添加一个类。我唯一的问题是,因为我的随机生成器经常生成相同的数字,所以程序通常不会将类附加到四个随机div,而很可能是三个甚至两个。所以我的问题是,如果可能的话,我如何设置我的程序只生成四个不同的数字。 我听说过费舍尔·耶茨的尝试,但我没有完全理解。 这是我的JS: for(var i = 4; i>0; i--){ var rand = Math.floor((Math.random()*16)+1); var array=

我对编程相当陌生,我一直在做一个项目,找到四个随机div并向其中添加一个类。我唯一的问题是,因为我的随机生成器经常生成相同的数字,所以程序通常不会将类附加到四个随机div,而很可能是三个甚至两个。所以我的问题是,如果可能的话,我如何设置我的程序只生成四个不同的数字。 我听说过费舍尔·耶茨的尝试,但我没有完全理解。 这是我的JS:

for(var i = 4; i>0; i--){
var rand = Math.floor((Math.random()*16)+1);
var array=new Array(); 
array[1] = "one";
array[2] = "two";
array[3] = "three";
array[4] = "four";
array[5] = "five";
array[6] = "six";
array[7] = "seven";
array[8] = "eight";
array[9] = "nine";
array[10] = "ten";
array[11] = "eleven";
array[12] = "twelve";
array[13] = "thirteen";
array[14] = "fourteen";
array[15] = "fifteen";
array[16] = "sixteen";
$('#'+array[rand]).addClass('bomb');
}

谢谢你的帮助

几个注释:首先,您应该在for循环之外初始化数组,以便它只执行一次。此外,正如@zerkms所指出的,数组应该从索引0开始,而不是从1开始。为了防止重复某个数字,只需从数组中删除已选择的数字。下面是一个如何做到这一点的示例:

var array=new Array(); 
array[0] = "one";
array[1] = "two";
array[2] = "three";
array[3] = "four";
array[4] = "five";
array[5] = "six";
array[6] = "seven";
array[7] = "eight";
array[8] = "nine";
array[9] = "ten";
array[10] = "eleven";
array[11] = "twelve";
array[12] = "thirteen";
array[13] = "fourteen";
array[14] = "fifteen";
array[15] = "sixteen";
for(var i = 4; i>0; i--){
    var rand = Math.floor((Math.random()*array.length));
    $('#'+array[rand]).addClass('bomb');
    array.splice(rand,1);
}
希望这有帮助


编辑:我已删除了导致错误的不必要的while循环。

这是主题问题的示例(从1到13)


这可以通过先洗牌数组来完成,如中所述

kfy(数组);
对于(变量i=0;i<4;++i){
$('#'+array[i]).addClass('bomb');
}

1。2.用
0
而不是
1
开始索引Fisher-Yates shuffle有什么问题?你看过这里吗。你需要洗牌数组,然后抓取四个元素。只需列出所有元素,洗牌列表,然后取前四个。如果您不想自己编写,请使用谷歌搜索[]。shuffle方法,但要注意基于sort()的方法;他们实际上不会随机化……不过,谢谢@Jlennon321——你的答案似乎让JSFiddle崩溃了!也许我错过了什么?我的错!我的代码有一个错误。我已经编辑过了,现在应该可以用了。谢谢你的帮助@杰伦农321
for (var i = 0, ar = []; i < 14; i++) { ar[i] = i; }
console.log( ar.sort(function () { return Math.random() - 0.5; }) );
[1, 2, 0, 3, 5, 6, 13, 4, 8, 9, 12, 10, 7, 11] ->> run first time
[3, 7, 4, 10, 1, 9, 11, 8, 13, 12, 2, 5, 0, 6] ->> runt second time
etc..
kfy(array);
for (var i = 0; i < 4; ++i) {
    $('#' + array[i]).addClass('bomb');
}