2012-05-10 12 views
0

毎回異なる2〜5の乱数を生成する必要があります。たとえば、2つの3を連続して、2つを5つ続けてはいけません。これを次のようにfor()ループに入力する必要があります。毎回異なる乱数を生成する

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

どうすればよいですか?

+6

を開始する前に、アレイ内のあなたのシリーズを得ることができます「私は、行に2人の3人の者を望んでいません、または2つの5が並んでいます。 - それはランダムではありません:) – jbabey

+0

数字のリストから乱数を求めて、それを持っていたらリストからこの数字を削除しますか? – andlrc

+0

jbabey:均等に分散した無相関の乱数ではありませんが、まだ確率的です。 –

答えて

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は、そう分を追加する米国4を与え、デルタを追加した後範囲はモジュロ4 2,3,0を得、2,3,4であり、1であります5,2。

+0

これは、OPが避けようとしていることをどのように回避するのですか? –

+0

デルタは、範囲(2〜5)以下に制限されています。実際には、衝突すると値を再生成せずに、現在の値を除くすべての値の範囲を減らします。 –

+0

あなたのコードには少し誤りがあると思いますが、現在は上限が生成されません。 – Yoshi

2

編集:より完全なソリューション、および固定off-by-oneエラー:これと同様に

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; 
} 
+0

私のために働かなかった。複数のことを繰り返す。 – j08691

+0

これは、非常に多くのポイントで同じ番号を連続して生成します。 – Amberlamps

+0

ええと、より完全な解決策に更新されました。 – jmar777

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) 
} 

今、あなたはランダムに値2, 3, 4 and 5としてvalueを使用してループを持っています注文。読んで


または、より簡単に: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); 
} 
0

あなたはlooping-

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