Начиная с здесь , вы можете видеть, что std::random_device
не всегда гарантирует недетерминированность:
std :: random_device может быть реализовано в терминах реализации-определенный механизм псевдослучайных чисел , если недетерминированный источник (например, аппаратное устройство) недоступен для реализации.В этом случае каждый объект std :: random_device может генерировать одинаковую числовую последовательность .
В Linux он по умолчанию использует /dev/urandom
или RDRND
инструкцию ЦП согласно здесь :
Реализации в libc ++ и libstdc ++ предполагают, что токен будет именем символьного устройства, которое при чтении выдает случайные числа со значением по умолчанию "/ dev/ urandom ", хотя там, где доступна инструкция процессора RDRND, libstdc ++ использует ее по умолчанию .
, которая не будет блокировать .Вы можете переключиться на даже защищенное устройство /dev/random
, используя подход здесь , но это устройство будет блокироваться, если не будет достаточно энтропии.
В Windows я не уверен насчет такого устройства, поэтомуон может откатиться к некоторому PRNG, который требует какого-то начального числа.
Чтобы решить проблему кросс-платформенно, как упоминал @Binara, вы можете использовать std::rand
из <cstdlib>
.Эта функция не блокируется, и вы можете использовать std::srand(somethingLikeCurrentTime)
, чтобы сделать ее кое-чем недетерминированной.
Как уже упоминалось @ user1118321, если вы хотите использовать более защищенный PRNG, вы можете рассмотреть std::mersenne_twister_engine
и использовать std::random_device
для генерации его начального числа.Этот подход предлагается здесь .