【发布时间】:2014-06-03 00:40:40
【问题描述】:
我对C中随机数生成器的实现有点困惑,这也明显不同于C++中的实现
如果我理解正确,对“srand(seed)”的调用会以某种方式初始化“rand()”可访问的隐藏变量(种子),这反过来将函数指向预先生成的序列,例如为example this one。对“rand()”的每次连续调用都会推进序列(显然在 C++ 中还有其他推进方式),这也表明使用内部隐藏指针或计数器来跟踪推进。
我发现了许多关于伪随机数生成算法如何工作的讨论以及函数 rand() 和 srand() 的文档,但无法找到有关这些隐藏参数及其行为的信息,除了according to this source,它们不是线程安全的。
这里有人可以解释一下这些参数是如何定义的吗?根据标准,它们定义的行为应该是什么,或者它们的行为是否是实现定义的?
它们是否应该位于调用 rand() 和 srand() 的函数/方法的本地?如果是这样,有没有办法将它们传达给另一个函数/方法?
如果您的答案是针对 C 或 C++ 的,请指出。任何信息将不胜感激。请记住,这个问题不是关于predictability of data generated by rand() and srand(),而是关于其内部变量的要求、状态和功能以及它们的可访问性和范围。
【问题讨论】:
-
srand()和rand()的示例实现可以在 C 标准中找到;请参阅N1570,第 7.22.2 节。这只是一个示例,但它应该给你一个想法。同一部分定义了这两个功能的要求。 -
感谢 Kevin Thompson 的参考。
-
我认为我的问题与被称为重复的问题大不相同。该问题并未询问 rand() 和 srand() 的内部变量的范围和可访问性。这个问题是关于可重复性的。如果我问的信息在那篇文章中可用,我就不会提出新问题