Согласованные псевдослучайные числа на разных платформах

Я ищу способ генерирования последовательностей псевдослучайных чисел, которые будут давать идентичные результаты последовательностей для заданного начального числа на любой платформе. Я предполагаю что 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 в обоих случаях.

Но вопрос остается. Я предполагаю, что приведенная выше спецификация применима только к ГСЧ в рамках одного и того же процесса. Скорее всего, в нем ничего не говорится о кроссплатформенных или кросс-компиляторных вещах. Лучше всего вам найти библиотеку, доступную для всех желаемых платформ. Тогда вы должны быть достаточно уверены в том, что если они будут заполнены одинаковыми значениями, они вернут одну и ту же последовательность чисел.

Другие вопросы по тегам