2012-08-31 11 views
8

私は現在、ランダムジェネレータに詰まっています。すべてのマシンは、同じシードを使用して同じ乱数の結果を生成しますか?

Random rand = new Random(3412); 

ランド結果を直接的に与えられ、他の性能のためには使用されない:要求仕様は、このようなサンプルを示します。

シード3412で乱数を生成するために、上記と同じコードを書いていますが、残りのパフォーマンスの結果はサンプルと全く異なります。

生成結果は518435373です。オンラインのC#コンパイラで試したのと同じコードを使用しましたが、生成の結果が11688046であり、残りのパフォーマンス結果もサンプルと異なります。

だから、私はちょうどそれが別のマシンで異なることになっているのだろうか?

ところで、私のものと同じかどうかは誰でもあなたのマシンから結果を提供することができます。

+1

これはあなた自身で簡単にテストできます。同じ乱数が出てきたら、与えられた種の乱数を1000回とし、同じく1000個の数値を返すことになります。これを非常に迅速にテストし、そうでないことが分かります。 – BugFinder

+2

@Bridge:*ランダムではありません。 *疑似乱数生成器です。 –

+0

@Bridge:そうではありません。私の答えに引用されている文書をお読みください。 –

答えて

14

の1つの実装は、同じシードに対して同じシーケンスを与えることが期待されますが、異なる実装が関係する可能性があります。たとえば、「オンラインC#コンパイラ」は、Monoを使用して終了する可能性があります。これは、.NETでの実装とは異なる実装が期待されます。

.NETのバージョンの間で実装が変更されたかどうかはわかりませんが、やはり完全に可能と思われます。

Random(int)コンストラクタ状態のマニュアル:

異なるランダムオブジェクトと同じシード値を与える乱数の同一の配列を生成するために、各インスタンスを引き起こします。

...しかし、異なるバージョンなどの意味は明記されていません。x86版とx64版で同じ結果が得られるかどうかはわかりません。私は*のいずれか、いずれかの特定のCLRインスタンス(すなわち、1つのプロセス、およびサイド・バイ・サイドを実行していない2のCLR内で同じ結果を期待したい。

を使用すると、より安定したものが必要な場合は、私が始めるだろうアルゴリズムを指定された - 私は賭け可能なメルセンヌツイスターなどの実装があります

+0

は、Visual Studioのバージョンが異なるため、2010年のプロフェッショナルを使用している可能性がありますが、サンプルコードで2010の表現が使用されていると思われます。 –

+1

@IvanLi:いいえ、違いはありません。異なるバージョンのフレームワークを対象にしてもうまくいくかもしれません。 –

6

をそれは、そのような約束をするよう指定されていないので、あなたはそれがないことを前提とすべきである

良いルール。どんな仕様であれ、合理的な使用のために必要でない約束をすることではないので、後で改良することが自由になります。

実際、Randomのドキュメントは言う:

ランダムクラスの現在の実装では、ドナルドE. Knuthの減法混色の乱数生成アルゴリズムに基づいています。

「現在の実装」というフレーズが将来変更される可能性があることに注意してください。これは非常に強く示唆しているが、バージョン間で一貫性があるという約束は存在しないだけでなく、そのどちらにも意図はない。

specに一貫性のある擬似乱数が必要な場合は、アルゴリズムとシード値を指定する必要があります。実際に、Randomがこのような約束をしているとして指定されていても、あなたの仕様の全部または一部の非.NET実装が必要な場合 - 将来的に相互運用するもの -

+0

* *ある程度まで約束していると指定されています* ...これはあまりよく指定されていません: "異なるランダムオブジェクトに同一のシード値を指定すると、各インスタンスは同じ乱数シーケンスを生成します。 - 残念ながら、それは異なるバージョンの安定性について何も言いません:( –

+0

@JonSkeetそれは私が話していた唯一の約束です。 –

0

試したオンラインプロバイダは、Microsoftが提供するものとは異なる、CLRのMono実装を使用する可能性があります。だからおそらく彼らのRandomクラスの実装は少し異なります。

1

これは、フレームワークのバージョンが異なるためです。見てくださいthis