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 中国語 Web サイトの他の関連記事を参照してください。