7

乱数を生成する C++11 の方法は次のとおりです。

  1. 乱数エンジンをインスタンス化する
  2. ランダム分布をインスタンス化する
  3. エンジンからディストリビューションを通じて乱数をプッシュする

問題は、乱数エンジンランダム分布の両方が、使用している演算のタイプに関してテンプレート化されていることです。

これら 2 種類の算術はどのように関連付ける必要がありますか?

エンジンに 32 ビット整数、ディストリビューションに 64 ビット整数、およびその逆を使用できますか? 危険は何ですか?浮動小数点型はどうですか?

私は、エンジンによって生成される可能性のある数の数は、取得したい個別の乱数の数以上でなければならないというガイドラインを仮定しています。残念ながら、私のコンピューターではuint_fast32_tuint_fast64_tは同じであり、3 つの C++11 ジェネレーターのそれぞれに対して提案された両方のエンジンが同じ結果を生成するため、仮説を検証することはできませんでした。

std::uniform_real_distributionstd:: 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 の入力に変換するためのアダプタ クラス。

任意」は心強いですが、それは標準ですか? 特に、検出が難しく、分布の正確性を損なう可能性のある隠れたオーバーフローが心配です。

4

1 に答える 1

2

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

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

于 2013-07-26T03:24:56.000 に答える