Генерация двух независимых случайных чисел упорядочивает (C++)

Я хотел бы смочь сделать что-то вроде этого (очевидно, не допустимый C++):

rng1 = srand(x)
rng2 = srand(y)

//rng1 and rng2 give me two separate sequences of random numbers
//based on the srand seed
rng1.rand()
rng2.rand()

Там какой-либо путь состоит в том, чтобы сделать что-то вроде этого в C++? Например, в Java я могу создать два java.util. Случайные объекты с семенами я хочу. Кажется, что в C++ существует только единственный глобальный генератор случайных чисел. Я уверен, что существуют библиотеки, которые обеспечивают эту функциональность, но так или иначе сделать это только с C++?

6
задан Neal 25 July 2010 в 14:24
поделиться

5 ответов

Используйте rand_r .

8
ответ дан 8 December 2019 в 12:18
поделиться

В TR1 (и C++0x) вы могли бы использовать заголовок tr1/random. Он должен быть встроен в современные компиляторы C++ (по крайней мере, в g++ и MSVC).

#include <tr1/random>
// use #include <random> on MSVC
#include <iostream>

int main() {

    std::tr1::mt19937 m1 (1234);  // <-- seed x
    std::tr1::mt19937 m2 (5678);  // <-- seed y

    std::tr1::uniform_int<int> distr(0, 100);

    for (int i = 0; i < 20; ++ i) {
        std::cout << distr(m1) << "," << distr(m2) << std::endl;
    }

    return 0;
}
7
ответ дан 8 December 2019 в 12:18
поделиться

Вы также можете использовать Boost.Random .

Дополнительная техническая документация здесь.

3
ответ дан 8 December 2019 в 12:18
поделиться

как сказал @James McNellis, я не могу представить, зачем вам это делать, и какие плюсы вы получите. Опишите, какого эффекта вы хотели бы добиться.

0
ответ дан 8 December 2019 в 12:18
поделиться

Я просто хочу отметить, что использование разных начальных чисел может не дать вам статистически независимых случайных последовательностей. mt19937 - исключение. Два объекта mt19937, инициализированные разными начальными числами, дадут вам более или менее (в зависимости от того, кого вы спросите) статистически независимые последовательности с очень высокой вероятностью (есть небольшая вероятность, что последовательности будут перекрываться). Стандартный ГСЧ в Java - заведомо плохой. Существует множество реализаций mt19937 для Java, которые следует предпочесть стандартному ГСЧ.

1
ответ дан 8 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: