2011-07-02 5 views
0

私が持っている:javascriptでその範囲内のすべての数値に対して特定の範囲の一意のランダムな整数を取得するにはどうすればよいですか?

function getRandomInt(min, max){ 
     return Math.floor(Math.random() * (max - min + 1)) + min; 
} 

をしかし、問題は、私は、配列内の要素で何かの人口をランダム化したい(そう、彼らは同じ順序で私が移入午前事で毎回表示されません)ので、私は必要です返される数字が今までの他の数字と比較して一意であることを保証する。

ので、代わりの:

for(var i = 0; i < myArray.length; i++) { 

    } 

私が持っている:

var i; 
var count = 0; 
while(count < myArray.length){ 
    count++; 
    i = getRandomInt(0, myArray.length); // TODO ensure value is unique 

    // do stuff with myArray[i]; 
} 

答えて

3

むしろ独立した一様乱数よりも、あなたはむしろランダム順列集合{1、2のをしたいように見えます、 3、...、N}となる。私はあなたのためにそれを行う配列のためのshuffleメソッドがあると思います。


要求されたように、ここでのコード例があります:

function shuffle(array) { 
    var top = array.length; 
    while (top--) { 
     var current = Math.floor(Math.random() * top); 
     var tmp = array[current]; 
     array[current] = array[top - 1]; 
     array[top - 1] = tmp; 
    } 
    return array; 
} 
+0

あなたは正しいです!私は答えとしてマークすることができますので、コードを含めることができます:function shuffle(array){ var tmp、current、top = array.length; if(top)while( - top){ current = Math.floor(Math.random()*(トップ+ 1)); tmp =配列[現在]; 配列[現在] =配列[先頭へ]; array [top] = tmp; } 戻り配列。 } – markmnl

2

時々何か(たとえばカードデッキ)をランダム化する最良の方法は、それを引き出す前にそれをシャッフルしないように、それを通りシャッフルすることですあなたはそれを引き出す。

は、あなたが持っていると言う:

var i, 
    endNum = 51, 
    array = new Array(52); 
for(i = 0; i <= endNum; i++) { 
    array[i] = i; 
} 

次に、あなたがこのような機能を記述することができます。

function drawNumber() { 
    // set index to draw from 
    var swap, 
     drawIndex = Math.floor(Math.random() * (endNum+ 1)); 

    // swap the values at the drawn index and at the "end" of the deck 
    swap = array[drawIndex]; 
    array[drawIndex] = array[endNum]; 
    array[endNum] = swap; 

    endNum--; 
} 

私は終了カウンタをデクリメントするので描かれたアイテムは、の末尾に「破棄」されますrandomize関数は0からendまでの項目を実行可能なものとして扱います。

これは私が使用した一般的なパターンです。前回使用したのは、単純なカードゲームをC#で作成して以来、間違ってjに採用しているかもしれません。実際に私はそれを見て、私は持っていたの代わりにint ____を持っていたlol

1

関数をArray.Sortメソッドに渡すことができます。この関数がランダムにゼロ以上の値を返した場合、配列はランダムにソートされます。

myarray.sort(function() {return 0.5 - Math.random()}) 

すべての乱数が一意であるかどうかを心配することなく、あなたのためのトリックを行う必要があります。

非常に単純なループはありません。

2

私がよく理解すれば、整数の配列が必要ですが、ランダムにソートされます。それを行うには

方法はhere

まず記述されているrand関数を作成:次に

function randOrd(){ 
return (Math.round(Math.random())-0.5); } 

を、あなたの配列をランダム化します。次の例を示します役立つことを願っています

anyArray = new Array('1','2','3','4','5'); 
anyArray.sort(randOrd); 
document.write('Random : ' + anyArray + '<br />';); 

よろしく、

マックス

関連する問題