использование одного случайного движка для нескольких дистрибутивов в c++11
Некоррелированные параллельные случайные начальные числа с C++ 2011?
std::default_random_engine генерирует значения от 0,0 до 1,0
как генерировать некоррелированные случайные последовательности с помощью C++
Используя один и тот же генератор случайных чисел для нескольких функций
и испытав несколько трюки вызвали сомнения в моем концептуальном понимании генераторов случайных чисел для нескольких (разных) дистрибутивов в C++. В частности:
- Можно ли использовать один генератор для рисования чисел в разных распределениях (равномерном, биномиальном, ...) при условии, что у тебя нет многопоточности?
Код: Выделить всё
class Zsim {
private:
std::default_random_engine engine;
}
Код: Выделить всё
Zsim::Zsim(...)
{
std::random_device rd;
std::default_random_engine generator(rd());
engine = generator;
}
Код: Выделить всё
std::binomial_distribution B_distribution(9, 0.5);
int number = B_distribution(engine);
std::uniform_real_distribution R_distribution(0, 15);
position.x = R_distribution(engine);
position.y = R_distribution(engine);
Некоторые отметили, что использование std::random_device полезно, в то время как другие предположили, что это может выдавать ошибку по ряду причин, и его следует избегать или пытаться/перехватывать ( см.: Использование одного и того же генератора случайных чисел в нескольких функциях).
- При использовании одного механизма случайных чисел для нескольких дистрибутивов в C++11 Было высказано предположение, что при моделировании случайного или броуновского движения в n-мерностях (n=2 в примере, приведенном MosteM) вам понадобится один генератор на каждое измерение, иначе они станут коррелированными, создавая искусственный дрейф. Хотя я согласен с этим утверждением, какова обоснованность этого утверждения, учитывая (огромный) период генератора? Если моделирование большое (большое количество шагов)? Должны ли мы всегда использовать один генератор для каждого измерения в качестве обеспечения? Кажется, это противоречит основному ответу о том, как генерировать некоррелированные случайные последовательности с помощью C++.
- Наконец, на примере Zsim, когда вы добавляете квалификатор const к метод и рисунок для биномиального распределения:
Код: Выделить всё
int Zscim::get_randomB() const { std::binomial_distribution B_distribution(9, 0.5); int number = B_distribution(engine); }
Предположим, что «движок» генератора каким-то образом изменяется при вызове дистрибутива. Что является причиной этого?
Подробнее здесь: https://stackoverflow.com/questions/480 ... tions-in-c