我需要生成一个介于 2 到 5 之间的随机数,每次都不同。例如,我不想连续出现两个 3,或者连续出现两个 5。然后我必须将其输入 for() 循环,如下所示:
for(var i = 0; i < noBoxes.length; i+=randNumber) {
//....
}
我该怎么做呢?
我需要生成一个介于 2 到 5 之间的随机数,每次都不同。例如,我不想连续出现两个 3,或者连续出现两个 5。然后我必须将其输入 for() 循环,如下所示:
for(var i = 0; i < noBoxes.length; i+=randNumber) {
//....
}
我该怎么做呢?
生成一个最多 n-1 的随机数并将其相加,对原始范围取模(因为最小值不为 0 而移动):
i = some random int from 2 to 5
delta = randInt(3) // range of possible values from 2 to 5 is 4, minus 1 to
// prevent getting all the way round to i again
nextval = (i-2+delta)%4+2 // shift i down by the minimum, add the
// delta and modulo the range
这是有效的,因为它在范围以下加起来为 1,因此它永远无法恢复到原始数字。比如i=3,随机int 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;
}
像这样:http: //jsbin.com/eyitav/
var loopingValues = [2, 3, 4, 5],
len,
value,
rand;
while ( (len=loopingValues.length) ) {
rand = ~~( ( Math.random() % 1 ) * len);
value = loopingValues.splice(rand, 1)[0];
//alert( value )
}
现在你有你的循环value
作为2, 3, 4 and 5
随机顺序的值。
或者更容易阅读:http: //jsbin.com/ejizuw/
var loopingValues = [2, 3, 4, 5],
value,
rand;
while ( loopingValues.length ) {
rand = Math.random();
if ( rand === 1 ) {
rand = 0;
}
rand = rand * loopingValues.length;
rand = Math.floor(rand);
value = loopingValues[rand];
loopingValues.splice(rand, 1);
alert(value);
}
您可以在开始循环之前将您的系列放在一个数组中 -
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]) {
....
}