C ++ повышает нормальные случайные числа в нескольких объектах

Извините, если это глупо. Я новичок в Boost и давно не использовал C ++. Это игрушечная проблема, пытающаяся вернуться в нее.

Предположим, у меня есть N игровые автоматы, которые выплачивают р на каждом пробеге. р нужно нормально распределить. Среднее значение и дисперсия должны быть разными для каждой машины. Мой текущий код C ++ 11 выглядит так:

narm.h:

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;
};

narm.cpp

// 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() функция, которая просто возвращает случайное число.

У меня есть несколько дополнительных вопросов.

  1. Я немного волнуюсь за свои семена. Я убежден, что ни одно из начальных значений не будет таким, как конструкторы вызываются в порядке от 0 до n-1. Так что оба std::time а также num всегда увеличиваются. Есть ли что-то еще, что мне нужно беспокоиться здесь?
  2. Я не посеял mt19937 объект в инициализаторе, потому что у меня нет num еще.

Главный вопрос

Можно ли использовать все эти разные генераторы случайных чисел или я должен использовать один генератор, который будет использоваться всеми объектами? Если совместное использование одного лучше, как мне обрабатывать различные средние / дисперсионные значения для каждого объекта?

Спасибо!


Обновить

Вот следующие обновления на основе ваших комментариев / ответов:

narm.h

#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;
};

narm.cpp

#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;
}

1

Решение

Я немного волнуюсь за свои семена.

Так как вы говорите, что используете C ++ 11, вы можете запустить генератор из std::random_device, который будет использовать источник истинной случайности, если возможно, и даст (надеюсь) хорошие псевдослучайные числа в противном случае.

(Кстати, если вы используете C ++ 11, то все это теперь в стандарте <random> библиотека, так что нет необходимости в Boost).

Я не заполнил объект mt19937 в инициализаторе, потому что у меня еще нет num.

Вы можете изменить порядок членов так, чтобы num инициализируется первым. Конечно, это не имеет значения, если вы используете std::random_device,

Можно ли использовать все эти разные генераторы случайных чисел или я должен использовать один генератор, который будет использоваться всеми объектами?

Случайность, вероятно, не хуже, но я не настолько опытен в таких вещах, чтобы сказать наверняка. Это кажется довольно расточительным, так как каждый генератор имеет несколько килобайт состояния.

Если совместное использование одного лучше, как мне обрабатывать различные средние / дисперсионные значения для каждого объекта?

У вас может быть несколько генераторов вариаций, использующих разные распределения, но один и тот же базовый генератор.

ВНИМАНИЕ: не используйте это в реальном игровом автомате. Генератор Мерсенна Твистера не подходит для криптографии, как описано Вот.

1

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

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

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