Я пытаюсь преобразовать эту строку Matlab в C ++: rp = randperm(p);
После randperm
документация:
randperm использует тот же генератор случайных чисел, что и rand
И в rand
страница:
rand возвращает одно равномерно распределенное случайное число
Так rand
следует равномерному распределению. Мой код на C ++ основан на:
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(... , ... ,g);
Мой вопрос: приведенный выше код следует равномерное распределение? Если нет, то как это сделать?
Различные классы из 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
также должен вести себя равномерно. Итак, все настолько однородно, насколько это возможно.
Других решений пока нет …