У меня есть небольшой фрагмент кода, который запускает Вихрь Мерсенна ПСЧ и он прекрасно работает:Как запустить 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;
}
Какой компилятор вы используете? Это работает для меня просто отлично, используя 'g ++ - 4.9'. – user14717
Вы всегда получаете одну и ту же последовательность случайных значений в первом случае? – didierc
Я использую MinGW и на самом деле теперь, когда я проверил, я получаю одинаковые десять случайных чисел, каждый из которых запускается с первым кодом. –