C에서 MT19937 PRNG를 철저하게 시드하는 방법
일반적으로 std::random_device는 다음과 같이 난수를 생성하는 데 사용됩니다. 다음 코드는:
std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(0, 5); dis(gen);
그러나 이 방법은 결함이 있는 이유:
보다 안정적인 접근 방식은 Windows의 CryptGenRandom 또는 Unix 계열 시스템의 /dev/urandom과 같은 CSPRNG를 사용하여 고품질 무작위 바이트를 생성하여 PRNG를 시드하는 것입니다. 예를 들면 다음과 같습니다.
#include <bit> #include <iostream> #include <string> size_t sysrandom(void* dst, size_t dstlen) { std::ifstream stream("/dev/urandom", std::ios_base::binary | std::ios_base::in); stream.read((char*)dst, dstlen); return dstlen; } int main() { std::uint_least32_t seed; sysrandom(&seed, sizeof(seed)); std::mt19937 gen(seed); // Your code to use the generator here... return 0; }
이 코드는 /dev/urandom을 CSPRNG로 사용하고 32비트 값을 사용하여 PRNG를 시드합니다. 이 값은 더 나은 보안을 위해 늘려야 합니다. 이 접근 방식은 이식 가능하고 잘 테스트되었으며 사용하기 쉬우며 C에서 난수를 생성하기 위한 견고한 기반을 제공합니다.
위 내용은 안전한 난수 생성을 위해 C에서 MT19937 PRNG를 올바르게 시드하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!