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 インフラストラクチャと相互運用できます。