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