2011-01-14 3 views
1

私はjavascriptのMath.random()について質問があります。Javascriptを: - ランダムな集合から要素を除外する(好奇心)が

私は(ゲームのために私が構築しています)しているランダムに指定されたセットからすべての番号を生成する(すなわち0から1000まで)、私は数値を生成する必要があるたびに、その数値がすでに生成されているかどうかをチェックする必要があります。

解決策は、生成されたセットにランダムな整数が既に存在するかどうかをチェックする簡単なアルゴリズムを考えるのは簡単です。それが見つからなくなるまで番号を生成します。 以下抜粋:

/* ... */ 
for(var i = 0; i<upperBound; i++){ 
    var randN = Math.floor(Math.random()*upperBound); 
    while(myRandomNumbers.contains(randN)){ 
     loops++; 
     randN = Math.floor(Math.random()*upperBound); 
    } 
    myRandomNumbers.push(randN); 
} 
/* ... */ 

running example here

私が知りたいのです:これは、これを達成するための最良の方法ですか?またはランダムな世代の特定のセットを除外するために「良い」数を生成するまでループするのではなく、何らかの方法がありますか?

ありがとうございます!

+0

たぶん、[この回答] (http://stackoverflow.com/questions/3796786/random-number-generator-without-dupes-in-javascript)が役立ちます。または[この1つ](http://stackoverflow.com/questions/2380019/generate-8-unique-random-numbers-between-1-and-100)。 – user113716

+0

@patrick dw:これは私の同じ解決策です、再帰的です; – stecb

+0

はい、私はあまりにも速く読んでいます。 – user113716

答えて

3
  1. が順番に数字のセットを生成します。これに類似

    何かが私のブログの記事の一つの主題でした。

  2. リストをランダムに並べ替えます。ここで

naive, biased sortを使った例です:

for (var nums=[],i=0;i<1000;++i) nums[i]=i+1; 
nums.sort(function(){ return Math.random()-0.5 }); 

その後、あなたは次の「ランダム」番号を取得するnumsのオフだけpop()番号は、以前に使用されていない決してすることを保証することができます。

+0

答えに記されているように、これは非常にランダムな分布ではなく、さまざまなブラウザで異なるバイアスを持っています。 Fisher-Yatesのシャッフルはそれほど多くのコードではありませんし、はるかに優れています。 –

+0

Fisher-Yatesの実装にリンクしているファイルの 'shuffle()'関数を参照してください。 – Phrogz

1

数字の範囲が非常に大きくない場合は、すべての数字を含むリストを生成し、ランダム化して1つずつ選択することができます。

ここでアクションで、この方法を示すためにあなたのサンプル実装の迅速なハックです:http://www.jsfiddle.net/ZTLt9/8/

0

何ブールビッグ1001の配列について。

あなたは数の確認したいすべてを行う必要が配列内のその位置に番号を確認され、生成されました:

if (!arr[randomnumber]){ 
    arr[randomnumber] = true; 
} 

終わりには、配列は見つけることがスキャンすることができますあなたが必要とする数字。

これは、スキャンによって順番に選択されるので、番号をソートするという副作用が追加されています。 http://www.jameswiseman.com/blog/2010/05/27/generate-and-sort-lottery-numbers/

1

私は配列を作成し、ランダムにシャッフルしたい:

function shuffle(arr) { 
    var shuffled = arr.slice(0), i = arr.length, temp, index; 
    while (i--) { 
     index = Math.floor(i * Math.random()); 
     temp = shuffled[index]; 
     shuffled[index] = shuffled[i]; 
     shuffled[i] = temp; 
    } 
    return shuffled; 
} 

// Create the array 
var i = 1000, arr = []; 
while (i--) arr[i] = i; 

// Shuffle it 
arr = shuffle(arr); 
0

最良の方法は、おそらくFisher-Yates shuffleを使ってシャッフル、その後、数字の配列を生成することであろう。ここで

はWikipediaの記事に与えられたJavaScriptの例である:

var n = a.length; 
for(var i = n - 1; i > 0; i--) { 
    var j = Math.floor(Math.random() * (i + 1)); 
    var tmp = a[i]; 
    a[i] = a[j]; 
    a[j] = tmp; 
} 

(これは、あなたが配列「」それはあなたがシャッフルしたい項目を含むを前提としています。)

関連する問題