解決C 語言中的PRNG 播種問題
儘管廣泛使用了
避免單獨依賴std::random_device 和time(NULL)
單獨使用std::random_device 或time(NULL) 不足以進行播種mt19937 由於低低熵和熵和熵不均勻分佈。
解決方案:使用 CSPRNG 包裝器
最小的解決方案是在 CSPRNG 周圍使用包裝器,例如 sysrandom定義如下。此包裝器提供對加密級隨機位元組的存取:
size_t sysrandom(void* dst, size_t dstlen);
特定於平台的實現
對於Windows,我們可以利用CryptGenRandom:
size_t sysrandom(void* dst, size_t dstlen) { HCRYPTPROV ctx; ... // Acquire and release cryptographic context CryptGenRandom(ctx, dstlen, dst); return dstlen; }
在類別Unix系統上,我們可以使用/dev/urandom:
size_t sysrandom(void* dst, size_t dstlen) { std::ifstream stream("/dev/urandom", std::ios_base::binary | std::ios_base::in); stream.read(dst, dstlen); return dstlen; }
播種mt19937
使用sysrandom 包裝器,我們可以為mt19937 播種>
std::uint_least32_t seed; sysrandom(&seed, sizeof(seed)); std::mt19937 gen(seed);
比較Boost
此方法與 boost::random_device 類似,後者在各種平台上利用安全 CSPRNG。其他注意事項
在 Linux 上,getrandom提供了 /dev/urandom 的更安全的替代方案。 OpenBSD 缺少 /dev/urandom;相反,使用 getentropy。結論
本文提供了有效播種 mt19937 PRNG 的全面指南,確保在 C 中產生高品質的隨機數以上是如何在 C 中可靠地播種 mt19937 以產生高品質的隨機數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!