0

最後にそれらすべてに遭遇したことを保証しながら、ランダムな順序で大きな連続した数値セット(0から10 ^ 9としましょう)を反復処理する方法はありますか? 数値が十分に大きく、配列のシャッフルが実行できないとしましょう。

 a = range(10**9); random.shuffle(a); # :(

これは、ある種の完全なハッシュ アルゴリズム (衝突ゼロ) がなければ不可能だと思います。

したがって、実際には「本当に」ランダムなマッピングは必要ないことを緩和状況として追加させてください。それはちょうど良い「広がり」を持たなければなりません。

4

2 に答える 2

2

モジュラスが反復したい範囲であるカスタマイズされた線形合同ジェネレーターを作成します。ハル・ドーベル定理の 3 つの要件 (リンクされたウィキペディアの記事の「周期の長さ」セクションで指定) に準拠している場合、ジェネレーターは循環する前にすべての値を反復処理します。終了するには、現在の繰り返しの生成値が初期値と等しいかどうかを確認します。

于 2013-09-15T15:53:13.947 に答える
0

Heres a wiki page on shuffling using the Fisher-Yates shuffling algorithm

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

Well, if you're using Java.. it is that easy.

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html

if not, I'd suggest looking at this:

http://www.geeksforgeeks.org/shuffle-a-given-array/

and if THAT doesn't work...

http://goo.gl/LkqffR

于 2013-09-15T15:35:54.843 に答える