2016-11-01 4 views
30

同じシードを持つ異なるオペレーティングシステムで同じ乱数シーケンスを実現する方法はありますか? 私はこのコードを試みた:私は、同じ種であるマシン上で複数回、このコードを実行した場合同一のシードを持つ異なるOSで同じ乱数シーケンスを実現する

std::default_random_engine engine(seed); 
std::uniform_int_distribution<int> dist(0, N-1); 

、DIST(エンジン)の配列が同じであるが、異なるオペレーティング・システム上で配列が異なっています。

+6

'std :: default_random_engine'は各システムで同じPNRGである必要はないので、' std :: mt19937'を使用してください。 –

+2

私は 'std :: mt19937'のような特定のランダムなエンジンは、特定のシードに同じ番号を与える必要があると信じていますが、私はそのディストリビューションがないと思います。したがって、独自の配布物を作成する必要があります。 –

答えて

37

はい、ありますが、別のプラットフォームが必要ですが、プラットフォームごとに同じPRNGを使用する必要があります。 std::default_random_engine engineは実装定義のPRNGです。つまり、すべてのプラットフォームで同じPRNGを取得できない可能性があります。あなたは同じものを持っていない場合、同じシーケンスを得るあなたのチャンスはかなり低いです。

std::mt19937のようなものがあります。同じ種子に同じ出力を与える必要があります。実際にstd::default_random_engine engine以外に定義されたすべてのジェネレータは、同じシードを使用すると同じ出力を生成します。<random>

もう1つ知っておくべきことは、std::uniform_int_distributionも実装定義です。使用する式は定義されていますが、実現方法は実装者に委ねられています。つまり、まったく同じ出力を得られない可能性があります。移植性が必要な場合は、独自のディストリビューションをロールバックするか、プラットフォームに関係なく常に同じサードパーティ製のものを入手する必要があります。

関連する問題