Следуют ли std::random_device и std::mt19937 равномерному распределению?
Я пытаюсь преобразовать эту строку Matlab в C++: rp = randperm(p);
После randperm
документация:
randperm использует тот же генератор случайных чисел, что и rand
И в rand
страница:
rand возвращает одно равномерно распределенное случайное число
Так rand
следует равномерному распределению. Мой код на C++ основан на:
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(... , ... ,g);
Мой вопрос: приведенный выше код следует равномерное распределение? Если нет, то как это сделать?
1 ответ
Различные классы из библиотеки случайных чисел C++ примерно работают следующим образом:
std::random_device
это равномерно распределенный генератор случайных чисел, который может получить доступ к аппаратному устройству в вашей системе, или что-то вроде/dev/random
в линуксе Обычно он используется только для генерации псевдослучайного генератора, поскольку базовое устройство обычно быстро исчерпает энтропию.std::mt19937
быстрый генератор псевдослучайных чисел, использующий механизм Мерсенна Твистера, который, согласно названию статьи оригинального автора, также является равномерным. Это генерирует полностью случайные 32-разрядные или 64-разрядные целые числа без знака. посколькуstd::random_device
используется только для заполнения этого генератора, он не обязательно должен быть равномерным (например, вы часто запускаете генератор, используя текущую временную метку, которая определенно не распределена равномерно).- Как правило, вы используете генератор, такой как
std::mt19937
кормить конкретное распределение, напримерstd::uniform_int_distribution
или жеstd::normal_distribution
которые затем принимают желаемую форму распределения. std::shuffle
согласно документации,Изменение порядка элементов в указанном диапазоне
[first, last)
так что каждая возможная перестановка этих элементов имеет равную вероятность появления.
В вашем примере кода вы используете std::mt19937
PRNG кормить std::shuffle
, Так, std::mt19937
равномерно, и std::shuffle
также должен вести себя равномерно. Итак, все настолько однородно, насколько это возможно.