乱数を生成する C++11 の方法は次のとおりです。
- 乱数エンジンをインスタンス化する
- ランダム分布をインスタンス化する
- エンジンからディストリビューションを通じて乱数をプッシュする
問題は、乱数エンジンとランダム分布の両方が、使用している演算のタイプに関してテンプレート化されていることです。
これら 2 種類の算術はどのように関連付ける必要がありますか?
エンジンに 32 ビット整数、ディストリビューションに 64 ビット整数、およびその逆を使用できますか? 危険は何ですか?浮動小数点型はどうですか?
私は、エンジンによって生成される可能性のある数の数は、取得したい個別の乱数の数以上でなければならないというガイドラインを仮定しています。残念ながら、私のコンピューターではuint_fast32_t
とuint_fast64_t
は同じであり、3 つの C++11 ジェネレーターのそれぞれに対して提案された両方のエンジンが同じ結果を生成するため、仮説を検証することはできませんでした。
std::uniform_real_distributionやstd:: uniform_int_distributionなどの C++11 ディストリビューションに関するドキュメントは、この点に関して不完全です。
このセクションは不完全です。理由: Generator の要件
ただし、たとえば、のgcc 4.7
実装uniform_real_distribution
は次のとおりです。
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 の入力に変換するためのアダプタ クラス。
「任意」は心強いですが、それは標準ですか? 特に、検出が難しく、分布の正確性を損なう可能性のある隠れたオーバーフローが心配です。