首页 > 后端开发 > C++ > 如何在 C 中可靠地播种 mt19937 以生成高质量的随机数?

如何在 C 中可靠地播种 mt19937 以生成高质量的随机数?

DDD
发布: 2024-11-29 13:36:25
原创
358 人浏览过

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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板