0

毎回異なる2から5の範囲の乱数を生成する必要があります。たとえば、3 が 2 つ連続したり、5 が 2 つ連続したりしたくありません。次のように、これを for() ループにフィードする必要があります。

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

どうすればこれを行うことができますか?

4

4 に答える 4

2

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 であり、デルタを追加した後の範囲は 2,3,4 であり、モジュロ 4 は 2,3,0 を生成するため、最小値を追加すると 4,5,2 が得られます。

于 2012-05-10T13:21:09.440 に答える
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;
}
于 2012-05-10T13:21:17.360 に答える
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);
}
于 2012-05-10T13:28:38.967 に答える
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]) {
    ....
}
于 2012-05-10T13:45:31.750 に答える