如何在 C 中彻底播种 MT19937 PRNG
通常,std::random_device 用于生成随机数,如下面的代码:
std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(0, 5); dis(gen);
但是,这个方法是有缺陷,因为:
更可靠的方法是使用 CSPRNG(例如 Windows 上的 CryptGenRandom 或类 Unix 系统上的 /dev/urandom)来生成高质量的随机字节来为 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中文网其他相关文章!