Использование случайной инфраструктуры Boost, но как легко заменить компонент (скажем, базовый генератор)?

Мой вариант использования, скажем, в классе.

Ускоренная инфраструктура Boost уже существует, и я стараюсь избегать синдрома NIH. Но скажем, я хочу

1- изучите свойства (хорошо, скажем, недостатки) различных PRNG и их влияние на, скажем, генерацию нормального (или другого распределения) разнообразия. Как это сделать и при этом сохранить другие функции Boost для генерации целого ряда дистрибутивов?

2. Используйте генератор Boot (скажем, Mersenne Twister) и протестируйте различные способы генерации других дистрибутивов (скажем, нормальных).

Есть ли простой и общий способ сделать такую ​​замену любого случайного компонента инфраструктуры Boost и по-прежнему иметь возможность использовать остальные?

0

Решение

Основной источник случайности в Boost.Random называется «генератором».
Есть несколько предоставлено в Boost, но я не вижу причин, по которым вы не можете использовать свои собственные.

Примеры в документах 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.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]