Генераторы случайных чисел с несколькими (некоррелированными?) распределениями в C++C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Генераторы случайных чисел с несколькими (некоррелированными?) распределениями в C++

Сообщение Anonymous »

Прочитав следующие вопросы:

использование одного случайного движка для нескольких дистрибутивов в 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;
}
и используя его для рисования n значений (возможно, больших) в различных распределениях (биномиальном и равномерном), скажем:

Код: Выделить всё

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);
    }
    
компилятор выдает ошибку: выражение, имеющее тип 'const std::tr1::default_random_engine', потеряет часть константы -летучие квалификаторы для вызова unsigned long std::tr1::mersenne_twister::operator()(void)

Предположим, что «движок» генератора каким-то образом изменяется при вызове дистрибутива. Что является причиной этого?

Подробнее здесь: https://stackoverflow.com/questions/480 ... tions-in-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»