0

私の使用例は、たとえば、教室での使用です。

ブースト ランダム インフラストラクチャは既に存在し、NIH シンドロームを回避しようとしています。しかし、言ってみましょう、私はしたいです

1-さまざまなPRNGのプロパティ(OK、欠陥など)と、正規(または他の分布)変量の生成への影響​​を研究します。それを行う方法と、多数のディストリビューションを生成する他の Boost 機能を保持するにはどうすればよいですか?

2- Boot (Mersenne Twister など) ジェネレーターを使用し、他のディストリビューション (通常のディストリビューションなど) を生成するさまざまな方法をテストします。

Boost ランダム インフラストラクチャ コンポーネントのいずれかをドロップインで置き換え、残りを引き続き使用できるようにする簡単で一般的な方法はありますか?

4

1 に答える 1

0

Boost.Random のランダム性の基本的なソースは、「ジェネレーター」と呼ばれます。Boostにはいくつか提供されていますが、代わりに独自のものを使用できない理由はありません。

ブースト ドキュメントの例は、ジェネレーター オブジェクトを作成し、それをディストリビューションに渡して一連の数値を取得する方法を示しています。

- 後で -

これが私が作り上げた基本的なジェネレーターです(rand48に基づいています):

#include <iostream>

#include <boost/random.hpp>

class my_rand {
public:
//  types
    typedef boost::uint32_t result_type;

//  construct/copy/destruct
    my_rand () : next_ ( 0 ) {}
    explicit my_rand( result_type x ) : next_ ( x ) {}

//  public static functions
    static uint32_t min() { return 0; }
    static uint32_t max() { return 10; }

    // public member functions
    void seed() { next_ = 0; }
    void seed(result_type x) { next_ = x; }
//  template<typename It> void seed(It &, It);
//  template<typename SeedSeq> void seed(SeedSeq &);
    uint32_t operator()() {
        if ( ++next_ == max ())
            next_ = min ();
        return next_;
        }

    void discard(boost::uintmax_t) {}
//  template<typename Iter> void generate(Iter, Iter);

    friend bool operator==(const my_rand & x, const my_rand &y);
    friend bool operator!=(const my_rand & x, const my_rand &y);
    // public data members
    static const bool has_fixed_range;
private:
    result_type next_;
};

bool operator==(const my_rand & x, const my_rand &y) { return x.next_ == y.next_; }
bool operator!=(const my_rand & x, const my_rand &y) { return x.next_ != y.next_; }
const bool my_rand::has_fixed_range = true;

int main ( int, char ** ) {
//  boost::random::mt19937 rng;
    my_rand rng;
    boost::random::uniform_int_distribution<> six(1,6);

    for ( int i = 0; i < 10; ++i )
        std::cout << six(rng) << std::endl;

    return 0;
    }

明らかに、出力はランダムではありません。ただし、Boost.Random インフラストラクチャと相互運用できます。

于 2012-11-19T15:47:07.597 に答える