Подтвердить что ты не робот

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

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

4b9b3361

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