Где я должен поместить свое поколение случайных чисел, чтобы получить случайные результаты? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть вложенная система, как описано в псевдокоде ниже (часть алгоритма случайного взвешенного большинства):

function1() { 
    //for 100 iterations:
        function2()
        // grab logistics
}
function2() {
    // create a random seed/generator
    random_device rd;
    mt19937 gen(rd);
    //for 1000 iterations:
        function3(gen);
}

function3(gen) {
    // grab number from uniform_real_distribution using gen
    // then use that number against differing weights
    // such that higher weight gets more territory in the uniform distribution for its desired outcome
    // that is in a system with weights (1, 1/2) distributed over a uniform distribution (0,1)
    // outcome of weight 1 happens if dist lands (0,.6666) and outcome of weight 2 if dist lands (.6666, 1)
}

В приведенном выше примереiform_real_distribution генерирует случайные числа, но function1 всегда заканчивается точно таким же результатом.

Однако, когда я запускаю эту функцию, она всегда будет получать одинаковые точные результаты в каждой итерации, даже если две другие функции должны быть случайными. Еще хуже, если я заменю генератор с чего-то вроде mt19937 на ranlux48, система будет получать одинаковые результаты на каждой итерации, но этот точный результат будет отличаться от того, который получил mt19937, что означает, что все, что я делаю, не случайно - зависит только от генератора.

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

Где я должен поместить gen и rd? Должен ли я даже использовать равномерное реальное распределение?

Если я создаю gen в function3 каждый раз, когда она вызывается, я все равно получаю неслучайные результаты, на самом делеiform_real_distribution генерирует точно одно и то же значение каждый раз

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Хотя вы показали только псевдокод, похоже, что вы создаете новое случайное устройство и генератор каждый раз, когда вызываете функцию. Это излишне дорого, и что более важно, каждый раз, когда вы вызываете функцию, вы получаете те же результаты от генератора случайных чисел. Простейшей модификацией вашего псевдокода было бы сделать генератор stati c, например так:

function2() {
    // create a random seed/generator ONCE only
    static random_device rd;
    static mt19937 gen(rd);
    // work
0 голосов
/ 04 мая 2020

Как указал user4581301 в комментариях, я использовал старую версию MinGW, в которой random_device не работал, каждый раз получая одно и то же начальное число. Следовательно, из-за возможностей моего генератора случайных чисел я начинаю с одного и того же начального числа и каждый раз получаю одинаковый результат. Это на самом деле не проблема программы, а проблема компилятора, поэтому я запутался!

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