0

ブーストには 2 つのランダム整数ジェネレーターがありboost::uniform_int<>boost::random::uniform_int_distribution<>後者はブースト 1.47 の後にのみ追加されます。

それらのパフォーマンス (つまり、生成される乱数の品質) に違いがあるかどうかを知りたいですか?

また、をboost::uniform_int<>介してランダムエンジンと結合する必要がありますが、使用できるboostの公式Webサイトvariate_generateにあるようです

boost::random::mt19937 rng;
boost::random::uniform_int_distribution<> six(1,6);
int x = six(rng);

変量生成なし。

これら 2 つの用法は同じ意味で使用できますか?

4

1 に答える 1

1

boost::uniform_int<>から継承しboost::random::uniform_int_distribution<>、のヘッダーuniform_int<>見ると、基本的に基本クラス関数を呼び出すだけであることがわかります。

uniform_int<>の関数を呼び出すだけなのでuniform_int_distribution<>、生成される数に違いはありません。Boostは明示的に述べていますが、これuniform_int<>は非推奨であり、uniform_int_distribution<>すべての新しいコードに使用する必要があります。

2番目の質問に答えるには、機能する必要uniform_int<>もありません。便宜上、乱数ジェネレーター(のような)を乱数分布(のような)に関連付けるだけです。を使用しない場合は、乱数を生成するたびに乱数ジェネレーターを渡す必要があります。次に例を示します。uniform_int_distribution<>boost::random::variate_generator<>variate_generator<>boost::random::mt19937uniform_int_distribution<>variate_generator<>

#include <boost/random/uniform_int.hpp>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/variate_generator.hpp>

#include <iostream>
#include <ctime>

int main()
{
  boost::mt19937 rand_generator(std::time(NULL));
  boost::random::uniform_int_distribution<> int_distribution(0, 100);

  //Need to pass generator
  std::cout << int_distribution(rand_generator) << std::endl;

  //Associate generator with distribution
  boost::random::variate_generator<boost::mt19937&,
                                   boost::random::uniform_int_distribution<>
                                   > int_variate_generator(rand_generator, int_distribution);

  //No longer need to pass generator
  std::cout << int_variate_generator() << std::endl;
}

uniform_int_distribution<> operator()最初の呼び出しはtoであるのに対し、2番目の呼び出しはtoであることに注意してくださいvariate_generator<> operator()。ジェネレーターをディストリビューションに関連付けても、元のジェネレーターまたはディストリビューションオブジェクトは変更されません。

不明な点がありましたらお知らせください。

于 2013-02-07T21:40:41.527 に答える