Я пытаюсь реализовать следующий класс:Что такое случайное распределение C++ 11?
typedef std::mt19937 Engine;
class Interval
{
public:
double upperBoundary;
double lowerBoundary;
double generateUniformRandomNumber(Engine& engine);
};
Я хочу класс работать в многопоточной среде. Каждый поток будет иметь свой собственный экземпляр объекта Engine
, и он передаст Engine
объектам любого класса с рандомизированным поведением.
Для того, чтобы генерировать случайные числа равномерно на C++ 11 образом, реализация generateUniformRandomNumber
бы быть что-то вроде этого:
uniform_real_distribution<double> distribution_; // private member of Interval
double Interval::generateUniformRandomNumber(Engine& engine)
{
return distribution_(engine);
}
Проблема заключается в том, что я не понимаю, C++ 11 распределения. Я знаю, что двигатели случайных чисел C++ 11 могут быть очень большими объектами (несколько килобайт), но как насчет дистрибутивов? Сначала я думал, что дистрибутивы - просто простые функторы, где operator()
- это функция pure const
, но, похоже, это не pure
, ни const
. Согласно reference, каждый экземпляр распределения имеет функцию-член reset()
. Это означает, что у него есть потенциально большое внутреннее состояние или, возможно, кеш.
Мой вопрос:
ли распределения имеют внутреннее состояние? Если да, то почему? Знает ли стандарт что-либо о размере этого состояния?
Это хорошая идея сделать реализацию, как я? Есть ли способ лучше?
В качестве примера я внедрил бета-дистрибутив (https://gist.github.com/sftrabbit/5068941), состояние которого фактически является двумя гамма-распределениями. 'reset' ничего не делает, потому что только требование состоит в том, что любые следующие значения не зависят от предыдущих применений двигателей. –
@sftrabbit Итак, 'reset()' там, если кто-то создает дистрибутив, который накапливает состояние при вызове 'operator()'? Например, каждый последующий вызов 'operator()' может дать вам возрастающий диапазон ... что также объясняет, почему 'operator()' не const, я думаю? – David
@Dave Да, нет причин, по которым распространение не может измениться, поскольку вы продолжаете вызывать 'operator()'. Это означает, что результирующие значения зависят от предыдущих вызовов. –