首頁 > 後端開發 > C++ > 如何在 C 中可靠地播種 mt19937 以產生高品質的隨機數?

如何在 C 中可靠地播種 mt19937 以產生高品質的隨機數?

DDD
發布: 2024-11-29 13:36:25
原創
318 人瀏覽過

How Can I Reliably Seed mt19937 in C   for High-Quality Random Number Generation?

解決C 語言中的PRNG 播種問題

儘管廣泛使用了對於隨機數生成,該方法通常依賴於std ::random_device,但它存在一些限制。認識到這些問題,本討論探討如何徹底、可移植且簡潔地為 mt19937 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板