2013-07-26 4 views
7
は、乱数を生成するC++ 11の方法である

指定したランダム分布で使用する乱数エンジンのタイプは何ですか?

  1. 乱数エンジン
  2. インスタンス化分布介してランダム分布
  3. プッシュエンジンから乱数をインスタンス

問題は、乱数エンジンランダム分布の両方が、aritのタイプあなたが使用しているかっこいいです。

これら2つのタイプの算術演算はどのように関連付ける必要がありますか?

あなたは分布と反対のためのエンジン用32ビット整数と64ビット整数を使用することはできますか?危険は何ですか? 浮動小数点型はどうですか?

私は、エンジンによって生成される可能性のある数の数が、得ようとしている別個の乱数の数よりも多いか、または等しい必要があるという仮説を仮定しています。残念なことに私の仮説をテストすることはできませんでした。私のコンピュータではuint_fast32_tuint_fast64_tが同じで、3つのC++ 11ジェネレータのそれぞれのエンジンが同じ結果を出すからです。

std::uniform_real_distribution

又はstd::uniform_int_distributionようなC++ 11のディストリビューションのドキュメントは、この点で不完全である:

このセクションでは不完全です。 理由:ジェネレータ

上の要件

しかしuniform_real_distributionのexapmple gcc 4.7実装があるため:

アダプタがある
template<typename _UniformRandomNumberGenerator> 
result_type 
operator()(_UniformRandomNumberGenerator& __urng, 
     const param_type& __p) 
{ 
    __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> 
    __aurng(__urng); 
    return (__aurng() * (__p.b() - __p.a())) + __p.a(); 
} 

いかなるの出力を変換するためのアダプタクラス Generatorを特定のDistributionの入力に入れます。

「任意」は安心して聞こえるが、それは標準ですか?私は、検出が困難で、流通の正確さを損なうおそれのある隠れたオーバーフローが特に心配です。

+1

要件はhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf(904ページ以降)に記載されています。私は答えを見つけることができませんでしたが、おそらくできますか? – Escualo

答えて

2

任意の分布関数に対して任意の一様乱数生成器(URNG)を使用することができます。分布関数は、必要なものを知っていると仮定され、URNGは、それが何を提供するのかを記述する必要があるため、分布関数は必要に応じて十分なエントロピーを要求できます。 (「エンジン」はシード可能性のような追加要件があるURNGであることに注意してください。)

GNU標準ライブラリの実装で言及している「ユニバーサル」アダプタは、一様乱数ジェネレータG(実際には名前はかなり長くなりますが、面倒です)と結果タイプRが必要ですタイプ。 Gは、返すことができる最小値と最大値であるG::minG::maxを定義する必要があり、等しい確率でそれらの制限の間のすべての値を返すことになっています。従って、G()への呼び出しからいくつの乱数のビットが利用可能かを知ることは簡単です。さらに、numeric_limits<R>から、Rに必要なビット数を教えてくれます。従って、利用可能なエントロピーによって必要とされるエントロピーを分割することにより、Gを呼び出す必要がある回数は、均一にランダムなRを生成する必要があります。そのため、アダプターはいくつかの結果タイプを生成するURNG /エンジンを取り、別の結果タイプを生成するためにそれを適応させます。

関連する問題