4

Boost Random ライブラリを使用して、モンテカルロ シミュレーション用の乱数を生成しています。結果を確認するために、実行ごとに異なる RNG エンジンを使用できるようにしたいと考えています。理想的には、typedef を介してコンパイル時に RNG を選択するなどの代わりに、実行時に使用する RNG を決定するコマンドライン オプションを使用したいと考えています。

次のようなことが可能な基本クラス T はありますか?または、そうでない場合、そうでない明白な理由は?

#include <boost/random.hpp>

int main()
{
    unsigned char rng_choice = 0;
    T* rng_ptr; // base_class pointer can point to any RNG from boost::random

    switch(rng_choice)
    {
        case 0:
            rng_ptr = new boost::random::mt19937;
            break;
        case 1:
            rng_ptr = new boost::random::lagged_fibonacci607; 
            break;          
    }

    boost::random::uniform_int_distribution<> dice_roll(1,6);

    // Generate a variate from dice_roll using the engine defined by rng_ptr:
    dice_roll(*rng_ptr);

    delete rng_ptr;

    return 0;
}
4

2 に答える 2

5

タイプの消去にはBoost.Functionを使用するだけです。

編集: 簡単な例。

#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/random/uniform_int_distribution.hpp>
#include <boost/random/mersenne_twister.hpp>

int main() {
  boost::random::mt19937 gen;
  boost::random::uniform_int_distribution<> dist(1, 6);

  boost::function<int()> f;

  f=boost::bind(dist,gen);
  std::cout << f() << std::endl;
  return 0;
}
于 2013-05-22T10:16:19.063 に答える
2

たとえば、mersenne twister のソース コードを見ると、基本クラスがないように見えます。必要なクラス階層を実装する必要があるようです。

于 2013-05-22T10:11:15.813 に答える