首页 > 后端开发 > C++ > 如何用 C 语言为 mt19937 生成完全随机的种子?

如何用 C 语言为 mt19937 生成完全随机的种子?

Mary-Kate Olsen
发布: 2024-12-04 06:59:13
原创
546 人浏览过

How Can I Generate Thoroughly Random Seeds for mt19937 in C  ?

在 C 中为 mt19937 生成彻底的随机种子

问题:

最近的答案经常建议使用 使用 std::random_device 来播种 mt19937 PRNG,这是有缺陷的,因为它不能提供足够的随机性,可以预测,并且可以使用具有固定种子的 PRNG。

便携式和彻底的播种:

一种可移植且彻底的播种 mt19937 的方法涉及使用 CSPRNG,例如如:

  • Windows: sysrandom 利用 CryptGenRandom
  • Unix-Like: sysrandom 利用 /dev/urandom (或 getrandom,如果可用) Linux 3.17 或更高)
  • OpenBSD: 利用 getentropy 的 sysrandom

代码示例:

#include <cstdint>
#include <cstdlib>
#include <fstream>

size_t sysrandom(void* dst, size_t dstlen);

std::uint_least32_t seed;
sysrandom(&seed, sizeof(seed));
std::mt19937 gen(seed);
登录后复制

Linux专业化getrandom:

#if defined(HAVE_GETRANDOM)
size_t sysrandom(void* dst, size_t dstlen) {
  int bytes = syscall(SYS_getrandom, dst, dstlen, 0);
  if (bytes != dstlen) {
    throw std::runtime_error("Unable to read N bytes from CSPRNG.");
  }
  return dstlen;
}
#endif
登录后复制

OpenBSD 特殊情况:

#if defined(HAVE_GETENTROPY)
size_t sysrandom(void* dst, size_t dstlen) {
  int bytes = getentropy(dst, dstlen);
  if (bytes != dstlen) {
    throw std::runtime_error("Unable to read N bytes from CSPRNG.");
  }
  return dstlen;
}
#endif
登录后复制

其他想法:

  • 使用无缓冲读/写方法实现加密安全随机字节。
  • 可以添加专用函数(例如,针对 Linux 或 OpenBSD)以提高效率。

以上是如何用 C 语言为 mt19937 生成完全随机的种子?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板