Javascript 产生一个每次都不同的随机数

Javascript 产生一个每次都不同的随机数,javascript,random,Javascript,Random,我需要产生一个介于2和5之间的随机数,每次都不同。例如,我不希望一行有两个3,或者一行有两个5。然后我必须将其输入到for()循环中,如下所示: for(var i = 0; i < noBoxes.length; i+=randNumber) { //.... } for(变量i=0;i

我需要产生一个介于2和5之间的随机数,每次都不同。例如,我不希望一行有两个3,或者一行有两个5。然后我必须将其输入到for()循环中,如下所示:

for(var i = 0; i < noBoxes.length; i+=randNumber) {
    //....
}
for(变量i=0;i

如何执行此操作?

生成一个最大为n-1的随机数,并将其相加,对原始范围进行模化(移动,因为最小值不是0):

这是因为它加起来等于范围下的1,所以它永远无法回到原始数字。例如,i=3,随机整数为0到2,因此最大值为(i-2+2)%3+2=3%3+2=0+2=2

function differentRandInt(min,max,current) {
    var shiftedcurrent = current-min;
    var range = max-min+1;
    var delta = Math.floor((Math.random()*(range-1))+1);
    return (shiftedcurrent + delta)%range + min;
}

如果i=3,那么i-min是1,加上delta后的范围是2,3,4,模4得到2,3,0,那么加上min就得到了4,5,2。

生成一个n-1的随机数,再加上,模原始范围(移动,因为min不是0):

这是因为它加起来等于范围下的1,所以它永远无法回到原始数字。例如,i=3,随机整数为0到2,因此最大值为(i-2+2)%3+2=3%3+2=0+2=2

function differentRandInt(min,max,current) {
    var shiftedcurrent = current-min;
    var range = max-min+1;
    var delta = Math.floor((Math.random()*(range-1))+1);
    return (shiftedcurrent + delta)%range + min;
}

如果i=3,那么i-min是1,加上delta后的范围是2,3,4,模4得到2,3,0,所以加上min得到4,5,2。

编辑:更完整的解决方案,并通过一个错误修复:

var prev, randNumber;
for(var i = 0; i < noBoxes.length; i+=randNumber) {
    do {
        randNumber = 2 + Math.floor(Math.random() * 4);
    } while(randNumber === prev);
    prev = randNumber;
}
var-prev,randNumber;
对于(变量i=0;i
编辑:更完整的解决方案,并通过一个错误修复:

var prev, randNumber;
for(var i = 0; i < noBoxes.length; i+=randNumber) {
    do {
        randNumber = 2 + Math.floor(Math.random() * 4);
    } while(randNumber === prev);
    prev = randNumber;
}
var-prev,randNumber;
对于(变量i=0;i
像这样:

现在你有了一个循环,
value
作为值
2、3、4和5,按随机顺序排列


或更容易阅读:

像这样:

现在你有了一个循环,
value
作为值
2、3、4和5,按随机顺序排列


或更容易阅读:


在开始循环之前,可以将序列放入数组中-

var noBoxes={length:100};
var R= [2], r= 2, n= 2;
while(R.length<noBoxes.length){
    n= R[R.length-1];
    while(r== n) r= 2+Math.floor(Math.random()*4)
    R.push(r);
}


And then loop through the array-

for(var i = 0; i < noBoxes.length; i+=R[i]) {
    ....
}
var noBoxes={length:100};
var R=[2],R=2,n=2;

而(R.length在开始循环之前,您可以将序列放入数组中-

var noBoxes={length:100};
var R= [2], r= 2, n= 2;
while(R.length<noBoxes.length){
    n= R[R.length-1];
    while(r== n) r= 2+Math.floor(Math.random()*4)
    R.push(r);
}


And then loop through the array-

for(var i = 0; i < noBoxes.length; i+=R[i]) {
    ....
}
var noBoxes={length:100};
var R=[2],R=2,n=2;


虽然(R.length这很可能在许多点上生成一行中相同的数字。它不需要迭代!只需将生成的随机数的范围限制为完整范围减去1。这是一个好主意。Phil。大致如下:
生成范围为1..n-1的随机数;如果随机数==上一个数字,则为随机数number=n;
(假设我们从1开始计数…)或者,像我的答案一样,用模来包围范围!这很可能在很多点上产生一行相同的数字。它不需要迭代!只需将生成的随机数的范围限制为完整范围减去1。这是一个好主意。Phil。大致如下:
生成范围为1..n-1的随机数;if random number==前面的数字,然后random number=n;
(假设我们从1开始计数…)或者,像我的答案一样,使用模来环绕范围!“我不希望一行有两个3,或者一行有两个5。”-那么它就不是随机的:)所以你想从一个数字列表中得到一个随机数,然后在你得到它之后从列表中删除这个数字?jbabey:它不会是一个均匀分布、不相关的随机数,但它仍然是随机的。哈哈,是的,你是对的,它不会是完全随机的,但我假设初始的数字是随机的,然后人们会检查这个,然后检查相应地计算第二个数字。“我不希望一行有两个3,或者一行有两个5。”-这样就不会是随机的:)所以你想从一个数字列表中得到一个随机数,然后在你得到它之后从列表中删除这个数字?jbabey:它不会是一个均匀分布、不相关的随机数,但它仍然是随机的。哈哈,是的,你是对的,它不会是完全随机的,但我假设初始的数字是随机的,然后人们会检查这个,然后检查相应地对第二个数字进行nge。这如何避免OP试图避免的事情?它增加了一个限制在范围(2到5)以下的增量。实际上,它将数字的范围缩小到除当前值之外的所有值,而不必在发生冲突时重新生成值。我认为您的代码中有一个小错误,当前它不会生成上限。@Yoshi:对不起,错过了范围的+1。正如有人所说,计算机科学中有三个难题:缓存失效、错误以一个错误结束。尽管如此,这对于此类问题来说是一个非常好的解决方案。我肯定是+1;)这如何避免OP试图避免的问题?它添加了一个限制在范围(2到5)以下的增量。实际上,它将数字的范围缩小到除当前值之外的所有值,而不必在发生冲突时重新生成该值。我认为您的代码中有一点错误,目前它不会生成上限。@Yoshi:抱歉,该范围中没有+1。正如有人所说,计算机科学中有三个难题:缓存失效和一个接一个的错误。尽管如此,这是解决此类问题的一个非常好的方法。绝对是我的+1;)