2009-03-16 10 views
5

数字を入力してから乱数のセットを受け取る必要があります。しかし、私はそれを実行するコンピュータに関係なく、それらの数字を同じにしたい(私は同じシードを提供すると仮定)。C++での確定的乱数ストリームSTL

基本的に私の質問は:rand()を使用して、現在の時刻ではなくユーザー定義のシードをsrand()に供給すれば、どのコンピュータでも同じ乱数ストリームを生成できますか?

答えて

5

srand() & rand()は、STLの一部ではありません。実際にはCランタイムの一部です。 はい、同じ実装であれば同じ結果が得られますsrand()/rand()の実装です。

必要に応じて、Boost.Randomを使用することを検討してください。これは、いくつかの高品質な乱数発生器を提供します。

+0

Boost.Randomで+1する必要があります。偉大な作品と彼らは特定の決定的なクラスを持っています。 – rlbond

4

rand()の実装が同じであると仮定すると、そうです。

これを確実に行う最も簡単な方法は、プロジェクトのソースコードに含まれるか、管理できるライブラリの形式で、プログラムに既知のrand()実装を含めることです。

+0

「Every」は大文字です。これを「Every」ではなく「Most」で修飾する必要があります。最新のRNGのほとんどは、32ビットハードウェアのほとんどのファミリで一貫して動作するように設計されています。しかし、それは64ビットマシンやまれな特有のハードウェアについては何も言わない。 –

+0

これは、あなたが制御できる、または少なくとも予測できるrand()のコピーを持つ必要があると言った理由です。 – greyfade

+0

十分な公正:-)確認する唯一のもう一つの点は、すべてのターゲットアーキテクチャに対するデータ型に関して移植性があることです。 –

0

同じシードのsrandを指定すると、同じ結果が得られます。これは、擬似乱数ジェネレータの観点から、シードの定義とほぼ同じです。

7

PRNGがライブラリとして利用可能です。一つを選ぶ。私はMersenne Twisterを使う傾向があります。

外部から提供されるライブラリを使用すると、言語ライブラリrand()の奇妙でバグの多い実装が回避されます。プラットフォームがすべて同じ数学的セマンティクスに準拠している限り、一貫した結果が得られます。

私は物理学者ですから、MTは私のお気に入りです。私はモンテカルロにこれらを使用しています。そこでは、高次元への均等分布の保証が重要です。しかし、は、暗号化PRNGとしてMTを使用しません!

+0

好奇心の疎かに、MTを暗号に使うのはなぜですか?リンクを共有していますか? (それは正直な質問です、私は気にならないようにしようとはしていません:-) –

+0

これは、少数の既知の出力から容易に予測されます。ウィキペディアの記事にリンクがあります。 – dmckee

+1

http://ja.wikipedia.org/wiki/Mersenne_twister#Application –

0

はい。与えられたシード(開始値)に対して、rand()が返す一連の数字は常に同じです。

+0

これを "与えられたrand()の実装"で修飾する必要があります。同じシーケンスを生成するPRNGは2つありません。 – greyfade

1

いいえ、ANSI C標準のみrand()が少なくとも32767(source)でなければならない0とRAND_MAXの間のランダムな整数のストリームを生成しなければならないことを指定します。このストリームは、特定のマシン上での特定の実装では、同じシードで同じ整数ストリームを生成する必要があるという点でのみ、決定論的でなければなりません。

ポータブルPRNGが必要です。Ben Pfaff's homegrown C99-compliant PRNGのように、Mersenne Twister(多くの実装が一番下にリンクされています)は移植性があります。 Boost.Randomも問題ありません。 Boostを使用しても、プラットフォームの選択肢が大きく制限されることはありません(ただし、コンパイルされていないコンパイラでは、テンプレートメタプログラミングの使用が問題になることがあります)。これは、少量の組み込みプラットフォームや斬新なリサーチアーキテクチャでは本当に問題になります。したがって、「任意のコンピュータ」とは「GCCがターゲットとするx86/PPC/ARM/SPARC/Alpha /などのプラットフォーム」を意味する場合、上記はうまくいくはずです。