Согласованные псевдослучайные числа на разных платформах
Я ищу способ генерирования последовательностей псевдослучайных чисел, которые будут давать идентичные результаты последовательностей для заданного начального числа на любой платформе. Я предполагаю что rand()
/ srand()
не собирается быть последовательным (я мог легко ошибиться в этом предположении).
6 ответов
Что-то вроде Mersenne Twister (из Boost.Random) является детерминированным.
Кнут выпустил в общедоступный исходный код C (и FORTRAN) для генератора псевдослучайных чисел, описанного в разделе 3.6 "Искусства компьютерного программирования".
Я понимаю, что это старая тема, но теперь с C++11 доступно множество новых опций. Вот пример со страницы, которая по умолчанию использует Mersenne Twister
двигатель и Normal
распределение:
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
int main()
{
std::random_device rd;
//
// Engines
//
std::mt19937 e2(rd());
//std::knuth_b e2(rd());
//std::default_random_engine e2(rd()) ;
//
// Distribtuions
//
std::normal_distribution<> dist(2, 2);
//std::student_t_distribution<> dist(5);
//std::poisson_distribution<> dist(2);
//std::extreme_value_distribution<> dist(0,2);
std::map<int, int> hist;
for (int n = 0; n < 10000; ++n) {
++hist[std::round(dist(e2))];
}
for (auto p : hist) {
std::cout << std::fixed << std::setprecision(1) << std::setw(2)
<< p.first << ' ' << std::string(p.second/200, '*') << '\n';
}
}
Я работал над simplerandom
библиотека для этого. Предполагается, что он будет кроссплатформенным, и я также нацеливаюсь на несколько языков. В настоящее время он поддерживает C и Python (одинаковые числа, сгенерированные на обоих языках). Я планирую вскоре внедрить те же генераторы в C++, следуя случайным API Boost и C++ 11.
Самым простым способом было бы написать генератор случайных чисел самостоятельно, но также могла бы работать библиотека, выпущенная для разных платформ и гарантирующая одинаковые результаты.
Я сомневаюсь, что rand()/srand() согласуются, но я этого не знаю.
Беглое упоминание говорит:
Две разные инициализации с одним и тем же начальным числом дают команду генератору псевдослучайного числа генерировать одинаковую последовательность результатов для последующих вызовов rand в обоих случаях.
Но вопрос остается. Я предполагаю, что приведенная выше спецификация применима только к ГСЧ в рамках одного и того же процесса. Скорее всего, в нем ничего не говорится о кроссплатформенных или кросс-компиляторных вещах. Лучше всего вам найти библиотеку, доступную для всех желаемых платформ. Тогда вы должны быть достаточно уверены в том, что если они будут заполнены одинаковыми значениями, они вернут одну и ту же последовательность чисел.