2017-04-15 5 views
2

http://www.cplusplus.com/reference/cstdlib/rand/競合状態を避けるために、rand()の代わりに?よる

Cにおいては、ランドによって使用される生成アルゴリズムのみ この関数の呼び出しによって前進されることが保証されます。 C++ではこの制約が緩和されており、ライブラリの実装では という要素への呼び出しなど、他の状況で ジェネレータを進めることができます。その後、

しかし、ここの上に、それは言う:

機能は、内部状態のオブジェクトにアクセスし、変更し、どのランドやsrand関数への同時通話で 原因データレースをしてもよいです。

一部のライブラリでは、この種のデータ競合を明示的に回避する代替機能が提供されています(rand_r(非移植性))。

C++ライブラリの実装では、 のデータ競合が保証されていません。それは、そのインスタンス、および特定の種のために、私はいつもインスタンスへの通話のための番号の同じシーケンスを生成するよう

理想的には私は、ランドの「インスタンス」のいくつかの種類を持っていると思います。現在のバージョンでは、いくつかのプラットフォームでは、他の関数からrand()への呼び出し(多分異なるスレッドでさえ)が、自分のコードによってスレッド内で生成される数値の順序に影響を与える可能性があります。

シードが与えられている特定のシーケンスを生成することが保証されている「インスタンス」と、別の「インスタンス」への他のコールがそれに影響を与えないことを保証している代替がありますか?

編集:明確にするために、私のコードは複数の異なるプラットフォーム(iOS、Android、Windows 8.1、Windows 10、Linuxなど)で動作する予定であり、現時点ですべての実装をテストすることはできません。標準で保証されているものに基づいて実装したいのですが...

+2

C++ 11の乱数機能をチェックしてください:http://en.cppreference.com/w/cpp/numeric/random – aschepler

+0

@aschepler私は非常に多くの "ランダム"数字が気にしません..そこ非常に多くの異なるエンジンは、その1は、私が質問に尋ねる何がいるかを把握するために、本当に長い時間がかかりそう... –

+1

オーケーですが、新しい方法は、あなたが頼るのではなく、したいしかし、すべての状態を保存することができますいくつかのグローバルな状態。 – aschepler

答えて

5

あなたの共通の種(<random>ライブラリからのすべて)で発電を維持するためにstd::uniform_int_distributionstd::mt19937を利用することができます。

std::mt19937 gen(SEED); 
std::uniform_int_distribution<> dis(MIN, MAX); 
auto random_number = dis(gen); 

ここで、SEEDは、指定するシード番号です。あなたはそれを生成する必要がある場合、あなたはそのためのstd::random_deviceを使用することができます

std::mt19937 gen{}; 
gen.seed(SEED); 

:あなたはあまりにも.seed方法で、後で別のシードを設定することができます

std::random_device rd{}; 
std::mt19937 gen(rd()); 

dis(MIN, MAX)部分が最小と最大の範囲を設定し、値がMAXより大きい値、またはMINより小さい値を生成しないことを意味します。 dis(gen)

最後に、あなたはそうのようなあなたの望んでいたランダムな値を生成するには、このディストリビューションを使用して発電機を使用することができます。分布は、任意の発電機を取ることができますので、あなたは、乱数の同じシーケンスで他のディストリビューションをしたい場合、あなたはgenのコピーを作成するか、同じシードを使用し、二つ以上の発電機を構築することができます。

+0

この部分はSTLですか? –

+0

@KaizerSozay、はい、標準C++ライブラリのものです。 –

+0

disとgenは、std :: mt19937とstd :: uniform_int_distributionの他のインスタンスとは完全に独立していますか?私はリンク先のドキュメントでそれを見つけることができませんでした... –

1
+0

セキュリティは私にとっては重要ではありません。なぜランダムが良いのか説明できますか?私はそれを播種し、同じシーケンスを得ることができますか? –

+0

random()はSTLの一部ではありません.STLには何かお勧めしますか? –

関連する問題