Извините, если это глупо. Я новичок в Boost и давно не использовал C ++. Это игрушечная проблема, пытающаяся вернуться в нее.
Предположим, у меня есть N игровые автоматы, которые выплачивают р на каждом пробеге. р нужно нормально распределить. Среднее значение и дисперсия должны быть разными для каждой машины. Мой текущий код C ++ 11 выглядит так:
class narm
{
public:
narm(int mean, int var); // Constructor takes mean and variance
double mean; // Local Mean
double variance; // Local Var
static int counter; // Static Counter for the number of objects so far
int num; // Which machine am I
boost::mt19937 random_number_generator;
boost::normal_distribution<> normal;
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor;
};
// Static variable
int narm::counter = 0;
// Constructor. Creates the mt19937 generator and normal distribution.
// Then make the generator.
narm::narm(int mean, int var) : random_number_generator(), normal(mean, var), var_nor(random_number_generator, normal)
{
this->mean = mean;
this->variance = var;
num = counter++;
// Seed the generator. The num is also used, as the constructors
// were called so fast that std::time was the same (correct solution?)
var_nor.engine().seed(std::time(NULL) + getpid() + num );
// I'm not entirely sure what this does.
var_nor.distribution().reset();
// Get random number
std::cout << num << " : " << var_nor() << std::endl;
}
Я буду иметь play()
функция, которая просто возвращает случайное число.
У меня есть несколько дополнительных вопросов.
std::time
а также num
всегда увеличиваются. Есть ли что-то еще, что мне нужно беспокоиться здесь?mt19937
объект в инициализаторе, потому что у меня нет num
еще. Можно ли использовать все эти разные генераторы случайных чисел или я должен использовать один генератор, который будет использоваться всеми объектами? Если совместное использование одного лучше, как мне обрабатывать различные средние / дисперсионные значения для каждого объекта?
Спасибо!
Вот следующие обновления на основе ваших комментариев / ответов:
#include<random>
class narm
{
public:
narm(int mean, int var);
int k;
int num;
double mean;
double variance;
static int counter;
static std::random_device rd; // Shared
static std::mt19937 generator; // Shared
std::normal_distribution<> distribution;
};
#include "narm.h"#include <random>
#include <iostream>
int narm::counter = 0;
std::random_device narm::rd;
std::mt19937 narm::generator(rd());
narm::narm(int mean, int var) : k(0), num(counter++), distribution(mean, var)
{
this->mean = mean;
this->variance = var;
std::cout << num << " : " << distribution(generator) << std::endl;
}
Я немного волнуюсь за свои семена.
Так как вы говорите, что используете C ++ 11, вы можете запустить генератор из std::random_device
, который будет использовать источник истинной случайности, если возможно, и даст (надеюсь) хорошие псевдослучайные числа в противном случае.
(Кстати, если вы используете C ++ 11, то все это теперь в стандарте <random>
библиотека, так что нет необходимости в Boost).
Я не заполнил объект mt19937 в инициализаторе, потому что у меня еще нет num.
Вы можете изменить порядок членов так, чтобы num
инициализируется первым. Конечно, это не имеет значения, если вы используете std::random_device
,
Можно ли использовать все эти разные генераторы случайных чисел или я должен использовать один генератор, который будет использоваться всеми объектами?
Случайность, вероятно, не хуже, но я не настолько опытен в таких вещах, чтобы сказать наверняка. Это кажется довольно расточительным, так как каждый генератор имеет несколько килобайт состояния.
Если совместное использование одного лучше, как мне обрабатывать различные средние / дисперсионные значения для каждого объекта?
У вас может быть несколько генераторов вариаций, использующих разные распределения, но один и тот же базовый генератор.
ВНИМАНИЕ: не используйте это в реальном игровом автомате. Генератор Мерсенна Твистера не подходит для криптографии, как описано Вот.
Других решений пока нет …