【问题标题】:What is the periodicity of the PRNG in GNU C Library?GNU C 库中 PRNG 的周期是多少?
【发布时间】:2011-09-13 03:49:45
【问题描述】:

是否有任何关于 gcc 的 g++ 中随机数生成器的周期性的文献(如果我们不重新播种该函数)?我想我可以自己进行测试,但最好能获得经过充分验证的研究。

提前感谢您的帮助。

// 编辑

我只是想补充一点,我已经搜索了很多引擎,但我没有找到任何具体的东西。我只阅读了关于周期性受表示种子所需的位数限制的一般 cmets。 (所以我猜考虑到 srand 通常是随时间调用的,所以周期性不能超过 10^12 左右。但是在我开始实现我的算法之前,更明确的东西会很有帮助。)

【问题讨论】:

  • 如果你的意思是 rand/srand:那不是 GCC 的一部分,而是 OS/C 库的一部分。
  • @Neil:你确定? Gccglibc 是 GNU 树上的不同项目,而 gcc 与其他 libc 一起工作得很好。当然,它们旨在一起使用,并且通常一起发布,但这与单个项目或产品并不完全相同。
  • “它们通常一起发布”——除了在数以万计的使用 BSD libc 的 Mac 上。
  • ... 在 MS Windows 上,cygwin gcc 使用 newlib,Neil 自己教我 mingw gcc 使用操作系统附带的 MSVCRT.DLL。
  • “它们通常一起发布”……在 Linux 上……其他人引用了 Windows、MacOS 和 BSD;我将添加 HP-UX、Solaris 和 AIX 作为 GCC 通常不附带 glibc 的其他平台。

标签: c++ random numbers


【解决方案1】:

在 rand(3) 手册页中搜索时,我发现:

rand() 和 srand() 的版本 Linux C 库使用相同的 随机数生成器为 random() 和随机()

所以我查看了 random(3) 手册页,这是你的答案:

这个随机数的周期 发电机很大,大约 16*((2**31)-1)

这对于教学目的非常有用,因为您想开发自己的 PRNG。但是,我不鼓励您在开发应用程序时使用此 PRNG。您应该更喜欢@Neil Butterworth 建议的 Boost.Random 实现之一(MT19937 是一个很好的默认 PRNG,足以满足大多数应用程序)。

最后,如果您打算了解有关 PRNG 的更多信息,我建议您阅读这两篇科学文章,很好地调查 PRNG。

用于随机高性能计算的随机流的实际分布,David RC Hill,高性能计算与仿真 (HPCS) 国际会议, 2010

伪随机数生成器,Pierre L'Ecuyer,量化金融百科全书 量化金融百科全书,2008

【讨论】:

  • Numerical Recipes 第 3 版 中关于随机数生成的章节也值得一读,而且是最新的(例如,它不提倡 Mersenne Twister)。跨度>
  • 我同意你的观点,我也可以添加 Knuth 的 计算机编程艺术,第 2 卷。但是,我在回答中引用的 2 篇论文更短,而且参考这两本书。
  • 非常感谢 jHackTheRipper!
【解决方案2】:

srand/rand 函数有点损坏。当您使用 C++ 时,我强烈建议您使用 boost 随机数库。它是一个只有头文件的库,所以你不需要构建任何东西。有一个如何使用它的例子here

【讨论】:

  • 在 C++0x 中,我们将 <random> 作为改进的 PRNG,不需要提升。
  • @Ben 我们不要屏住呼吸。而且我觉得界面是一样的?
  • FWIW,MT19937 has a period of 2^11213-1 -- 我认为它不会用完 :)
  • @pst:你错了,MT19937的句号是2^19937 - 1,这就解释了它的名字
猜你喜欢
  • 1970-01-01
  • 2011-12-17
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2021-04-14
  • 2010-09-19
相关资源
最近更新 更多