Согласованные псевдослучайные числа на разных платформах - PullRequest
27 голосов
/ 28 мая 2009

Я ищу способ генерации последовательностей псевдослучайных чисел, которые будут давать идентичные результаты последовательностей для заданного начального числа на любой платформе. Я предполагаю, что rand() / srand() не будет последовательным (я могу легко ошибиться в этом предположении).

Ответы [ 6 ]

19 голосов
/ 28 мая 2009

Что-то вроде Mersenne Twister (из Boost.Random) является детерминированным.

8 голосов
/ 28 мая 2009

Кнут выпустил в общедоступный исходный код C (и FORTRAN) для генератора псевдослучайных чисел, описанного в разделе 3.6 Искусство программирования .

6 голосов
/ 19 марта 2013

Я понимаю, что это старая ветка, но теперь с 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';
    }
}
1 голос
/ 08 ноября 2013

Я работаю над библиотекой simplerandom для этого. Предполагается, что он будет кроссплатформенным, и я также нацеливаюсь на несколько языков. В настоящее время он поддерживает C и Python (одинаковые числа генерируются на обоих языках). Я планирую вскоре реализовать те же генераторы в C ++, следуя случайным API Boost и C ++ 11.

0 голосов
/ 28 мая 2009

А быстро гуглил ссылка говорит:

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

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

0 голосов
/ 28 мая 2009

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

Я сомневаюсь, что rand () / srand () согласуются, но я этого не знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...