2015-01-03 2 views
1

У меня есть небольшой фрагмент кода, который запускает Вихрь Мерсенна ПСЧ и он прекрасно работает:Как запустить Mersenne Twister внутри функции?

std::random_device randDev; 
std::mt19937 twister(randDev()); 
std::uniform_int_distribution<int> dist(0,99); 

for (int i = 0; i < 10; i++) { 
    std::cout << dist(twister) << std::endl; 
} 

Он выводит десять случайных чисел. Однако, если я введю тот же код в функцию:

#include <random> 

int getRand(const int& A, const int& B) { 
    std::random_device randDev; 
    std::mt19937 twister(randDev()); 
    std::uniform_int_distribution<int> dist(A,B); 

    return dist(twister); 
} 

int main() { 
    for (int i = 0; i < 10; i++) { 
     std::cout << getRand(0,99) << std::endl; 
    } 

    return 0; 
} 

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

EDIT: Проблема заключается в std :: random_device. Это может быть ошибка в Eclipse C++ IDE (версия Luna) или MinGW 4.8.1, но по какой-либо причине случайное число всегда одинаково. Я считаю, что время (0) станет подходящим семенем для моих целей.

EDIT 2: Принимая во внимание предложение T.C. и тот факт, что время (0) по-прежнему приводит к десяти из того же числа, вот окончательный код. Я знаю, что rand() плохой, но он работает.

#include <iostream> 
#include <random> 

std::mt19937 twister(rand()); 

int getRand(const int& A, const int& B) { 
    std::uniform_int_distribution<int> dist(A,B); 

    return dist(twister); 
} 

int main() { 
    for (int i = 0; i < 10; i++) { 
     std::cout << getRand(0,99) << std::endl; 
    } 

    return 0; 
} 
+0

Какой компилятор вы используете? Это работает для меня просто отлично, используя 'g ++ - 4.9'. – user14717

+0

Вы всегда получаете одну и ту же последовательность случайных значений в первом случае? – didierc

+0

Я использую MinGW и на самом деле теперь, когда я проверил, я получаю одинаковые десять случайных чисел, каждый из которых запускается с первым кодом. –

ответ

0

Какой компилятор и ОС вы используете? Visual Studio 2012 (не уверен, что в 2013 году) не имела реальной реализации std :: random_device, а это означает, что она была инициализирована с одинаковым значением каждый раз - так что в таком случае вы должны были бы mersenne twister инициализироваться одним и тем же семенем каждый раз , таким образом, тот же результат.

И, кстати, кажется, что такой же вопрос был задан:

Why do I get the same sequence for every run with std::random_device with mingw gcc4.8.1?

так, по-видимому GCC4.8 на Windows, также зЬй :: random_device реализован в виде псевдо-случайного.

+0

Я использую Eclipse C++ IDE (Luna) с MinGW. –

+0

Я думаю, что ответ из упомянутой темы - это именно то, что вы ищете –

3

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

Правильный способ использования генератора случайных чисел - создать его один раз и использовать его столько раз, сколько потребуется для всей программы (или, по крайней мере, достаточно долго). В виде одной функции:

#include <random> 
#include <iostream> 

int getRand(const int& A, const int& B) { 
    static std::random_device randDev; 
    static std::mt19937 twister(randDev()); 
    static std::uniform_int_distribution<int> dist; 

    dist.param(std::uniform_int_distribution<int>::param_type(A, B)); 
    return dist(twister); 
} 

int main() { 
    for (int i = 0; i < 10; i++) { 
     std::cout << getRand(0, 99) << std::endl; 
    } 

    return 0; 
} 

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

+0

Спасибо за улучшение моего кода, но проблема в этом случае не факт, что я воссоздал семя, но ошибка с Eclipse или MinGW с помощью std :: random_device. –

+1

Проблема GCC random_device хорошо ответила на связанный вопрос. Мой ответ на вопрос, который вы изначально задали, и может быть полезен другим людям. – slajoie

Смежные вопросы