Я ищу способ генерировать последовательности псевдослучайных чисел, которые будут давать одинаковые результаты последовательности для данного семени на любой платформе. Я предполагаю, что rand()
/srand()
не будет последовательным (я мог бы ошибаться в этом предположении).
Согласованные псевдослучайные числа на разных платформах
Ответ 1
Что-то вроде Mersenne Twister (из Boost.Random) является детерминированным.
Ответ 2
Knuth имеет выпущенный в исходный код C (и FORTRAN) общего пользования для генератора псевдослучайных чисел, описанного в разделе 3.6 Искусство компьютерного программирования.
Ответ 3
Я понимаю, что это старый поток, но теперь с С++ 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';
}
}
Ответ 4
Я работал над библиотекой simplerandom
. Предполагается, что это межплатформенная платформа, и я также нацелен на использование нескольких языков. В настоящее время он поддерживает C и Python (те же номера, сгенерированные на обоих языках). Я планирую реализовать те же самые генераторы в С++ в скором времени, следуя произвольному API Boost и С++ 11.
Ответ 5
Самый простой способ - написать генератор случайных чисел самостоятельно, но использование библиотеки, выпущенной для разных платформ, и гарантированно даст одинаковые результаты, также может работать.
Я сомневаюсь, что rand()/srand() совместимы, но я этого не знаю.
Ответ 6
Быстро googled reference говорит:
Две разные инициализации с одним и тем же семенем, инструктируют псевдослучайный генератор для генерации той же последовательности результатов для последующих вызовов rand в обоих случаях.
Но вопрос остается. Я предполагаю, что вышеуказанная спецификация применима только к RNG в рамках одного и того же процесса. Скорее всего, он ничего не говорит о кросс-платформенных или кросс-компиляторных вещах. Лучше всего найти библиотеку, доступную для всех желаемых платформ. Тогда вы должны быть достаточно безопасны, чтобы при посеве с одинаковым значением они возвращали одну и ту же последовательность чисел.