1. ホーム
  2. c++

[解決済み] ブースト乱数発生器

2022-03-04 16:04:32

質問

どなたかお気に入りのブースト乱数生成器をお持ちの方、またそれをコードに実装する方法について少し教えてください。私はmersenne twisterを動作させようとしているのですが、誰か他のものを好んで使っている人がいるのではないかと思っていました。

どのように解決するのですか?

このコードは、以下のブーストマニュアルから引用しています。 http://www.boost.org/doc/libs/1_42_0/libs/random/index.html :

#include <iostream>
#include "boost/random.hpp"
#include "boost/generator_iterator.hpp"
using namespace std;

int main() {
      typedef boost::mt19937 RNGType;
      RNGType rng;
      boost::uniform_int<> one_to_six( 1, 6 );
      boost::variate_generator< RNGType, boost::uniform_int<> >
                    dice(rng, one_to_six);
      for ( int i = 0; i < 6; i++ ) {
          int n  = dice();
          cout << n << endl;
     }
}

ビットの説明のため。

  • mt19937 はメルセンヌ・ツイスター・ジェネレータで、生の乱数を生成します。ここでは typedef を使っているので、乱数発生器の種類を簡単に変更することができます。

  • rng はツイスタージェネレータのインスタンスです。

  • one_to_six のインスタンスです。 ディストリビューション . これは、生成したい数値とそれに従う分布を指定するものです。ここでは、1から6までの数字を均等に割り振りたい。

  • dice は、生の数値と分布を受け取り、私たちが実際に欲しい数値を作成するものです。

  • dice()operator() に対して dice オブジェクトを作成し、分布に従った次の乱数を取得することで、6面のサイコロをランダムに投げることをシミュレートします。

このままでは、このコードは毎回同じサイコロの目の並びを生成します。ジェネレータのコンストラクタでランダム化することができます。

 RNGType rng( time(0) );   

または、seed()メンバを使用します。