0

Boostを使用して乱数を生成しようとしていますが、すべてをカプセル化した状態に保つ方法で乱数を機能させるのに問題があります。main()にこのコードがあります。これにより、roll()を使用して[0,1)から乱数を生成できます。

boost::mt19937 rng(seed);
boost::uniform_01<> uniform_p;
boost::variate_generator< boost::mt19937, boost::uniform_01<> >
    roll(rng, uniform_p);

ここで、これを独自のヘッダー/ cppファイルに貼り付け、シードを取得してロールを作成する関数と、ロールを呼び出す関数を追加します。しかし、何もロールを見ることができないようであり、それを呼び出す関数がスコープ外になった後、スコープ外になると確信しています。staticとexternを試してみました。ロールをクラスの一部にして、スコープから外れないようにしましたが、何も機能しないようです。

4

2 に答える 2

1

seed.hファイルで宣言された関数とrool.cppファイルでのそれらの実装についてはどうでしょうか。static scoped_ptrヘルパーオブジェクトを.cppモジュールに格納し、静的初期化フェーズの後に初期化するために使用できます。スレッドセーフは、このソリューションで覚えておくべきもう1つのことです。

于 2012-08-12T17:28:31.173 に答える
0

以下は、乱数の生成に使用するMatlabのようなインターフェイスです。seed()を使用する前に電話する必要がありますrand()。グレッグが指摘したように、scoped_ptr必要な静的変数(メルセンヌツイスターと変量ジェネレーター)を保存すると便利です。スレッドセーフのために、これらのリソースをミューテックスで保護してください。

random.hpp

#ifndef RANDOM_HPP
#define RANDOM_HPP

void seed(unsigned s);
double rand();

#endif // RANDOM_HPP

random.cpp

#include "random.hpp"
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_01.hpp>
#include <boost/random/variate_generator.hpp>
#include <boost/scoped_ptr.hpp>

static boost::scoped_ptr<boost::mt19937> twister;
static boost::scoped_ptr<boost::variate_generator<boost::mt19937&,
                                                  boost::uniform_01<> > > vargen;

void seed(unsigned s)
{
    twister.reset(new boost::mt19937(s));
    vargen.reset(new boost::variate_generator<boost::mt19937&,
                                              boost::uniform_01<> >(
                     *twister, boost::uniform_01<>()));
}

double rand()
{
    assert(vargen.get() != 0);
    return (*vargen)();
}

main.cpp

#include "random.hpp"
#include <iostream>

int main()
{
    seed(42);
    for (int i = 0; i < 10; ++i)
        std::cout << rand() << std::endl;
    return 0;
}
于 2012-08-12T18:57:54.080 に答える