生成每次不同的随机数

时间:2012-05-10 13:19:35

标签: javascript random

我需要产生一个2到5之间的随机数,每次都不同。例如,我不想连续两个3,或连续两个5。然后我必须将它提供给for()循环,如下所示:

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

我该怎么做?

4 个答案:

答案 0 :(得分:2)

生成一个最大为n-1的随机数并将其加上,以原始范围为模(因为min不为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,所以max是(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。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

像这样: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);
}

答案 3 :(得分:0)

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

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]) {
    ....
}