2009-08-12 8 views
1

私は素早くPRNGを探していますので、オブジェクトの固有IDを素早く(半)作成できます。一意性は管理上の問題のほうが多く、IDの重複はごくまれにしか問題になりません。良い、速いPRNG(非暗号で安全)

パフォーマンスは重要で非順次です(IDがシーケンシャルな場合は、管理側のエラーが発生する可能性が高くなります)。また、私は低い数値を避けたいが、これは、十分に高い数値が検索されるまで、単に再試行することで簡単に緩和することができる。

編集 私も、私は、このようにGUIDが仕事やプラットフォームに依存しないように必要はありません(現在はPCに実装するだけでなく、ニンテンドーDS、PSP上で動作する必要がありますされ、32ビットであることをIDを必要とすることを追加する必要があります、PS3、Wii、Xboxなどのプラットフォーム)。また、1秒間に数千回と呼ばれることもあるので、入力ベースの乱数生成は実現できません。

おかげ

+0

あなたはどの言語/システムを使用していますか? –

+0

@ジョン:それはあまりにも多くのアルゴリズムに影響を与える必要がありますか? –

+0

ので、高速実装ではなく、prng用のアルゴリズムが必要です。 –

答えて

0

これはうまくいくかもしれない:現在の時間の

合計をエポック、スレッドIDと連番以来。

+0

それは良いアイデア、本当にスレッドIDのようなものを使用するとは思わなかった。これはすべてのプラットフォームで利用できるわけではありませんが、システムの周囲に分散している変数(現在のスキャンライン番号や単純なスタックウォークの値など)からランダムなデータを取得できます。 –

+1

これは主にシーケンシャルなストリームになるため、ひどい答えです(時間が必ずしも変わるわけではありませんし、スレッドIDが変わる理由はわかりません) –

+0

@StevenLu、私は同意します。それは恐ろしい答えでした!私はそれを書くことを覚えていない... –

3

GUIDs?多くの環境でこれらの生成がサポートされています。

0

私はあなたが正しいとは確信していませんが、Linuxボックスを使用している場合は、/ dev/urandomから読み込み、高品質の乱数のストリームを取得することができます。これらの数字は、必要な任意の長さの文字列を生成するために使用できます。 この解決方法を使用するには、マシンからユーザーからの入力が必要です(キーボード/マウス)。

0

PRNGの最適なアルゴリズムは、プログラミング言語が既に提供しているライブラリです。これは、よくテストされたアルゴリズムを持ち、おそらく/ dev/randomのようなあなたのコンピュータの既存の乱雑さの源を使用することについて賢明かもしれません。

「数値が低い」場合は、取得するまで再試行しないでください。それは永遠にかかるでしょう。単に乱数を取り、天井でモディファイします。つまり、

random() % 1000000 

は、0と999,999の間の乱数を返します。

+1

これらの一般的な方法は遅くなりますが、私はそれをする必要はありません高品質のランダム、ちょうど十分なランダム。また、私は多くのプラットフォームで壊れている非常に遅くなる 'rand()'しか唯一の標準アルゴリズムであるC++で作業しています。 –

+2

"あなたのPRNGに最適なアルゴリズムは、プログラミング言語が既に提供しているライブラリです。 - それが間違っていると面白くない。基本的にPRNG上のすべての単一ソースを参照して確認することができます。 –

1

実際に非連続部分だけが必要な場合は、X[i] = (X[i-1] + a) mod bの何が問題なのですか? aとbが共起している場合、これは期間bで繰り返されます。これにより、b = 2^32が簡単な選択肢になりますが、aは任意の素数> 2になります。性能はKHzではなくMHzで測定されます。

小さい数字を避けることも簡単です:X[i] = offset + (X[i-1] - offset + a) mod bのシーケンスを使用しますか?

+1

これは基本的にシーケンシャルではなく、ステップのステップではありませんか? –

+1

もちろん。しかし、それは疑問を考慮して十分に良いかもしれません。ポイントは本当にあります:オーバーエンジニアリングしないでください。 – MSalters

+0

+1 - また、aとbの適切な値のセットについてgoogle 'fishmanとmoore' – ConcernedOfTunbridgeWells

0

フィッシュマンとムーアは線形合同のPRNG(A(x) = A(x-1)|m)に関する論文を書きました。 This posting on Stackoverflowでは、このアルゴリズムについて説明しています。あなたのプラットフォームがすべて中間結果(64ビットのlong long変数が現代のCコンパイラすべてでサポートされるはずです)のための64ビットアキュムレータをサポートできるならば、これはM = 2^31-1で2^30の周期で、シンプルで高速です。上にリンクされている投稿には、FishmanとMooreの論文からのAのいくつかの良い値があります。

0

Try this George Marsagliaの礼儀。

1秒あたり20億の乱数を使用することはできません。

+0

SSE対応プロセッサを扱うだけで済むと、うれしいことです。残念なことに、私はx86(多くの場合、むしろ最小限の機能に絞ったもの)、PowerPC、Arm、MIPS、Cellプロセッサ(および場合によってはその他のもの)を扱います。 –

+0

あまり最適化されていないMarsaglia RNGの1つを使用してください。 –

関連する問題