【发布时间】:2014-11-30 02:10:54
【问题描述】:
这个comment,声明:
srand(time(0));我会将此行作为 main() 中的第一行 相反,如果多次调用它(实际上会导致更少 随机数)。
...我已经将我遇到问题的行加粗了...重复常见的建议,在程序中调用一次srand。像srand() — why call only once? 这样的问题重申,因为time(0) 以秒为单位返回当前时间,所以在同一秒内多次调用srand 将产生相同的种子。一种常见的解决方法是改用毫秒或纳秒。
但是,我不明白为什么这意味着 srand 应该或只能被调用一次,或者它如何导致随机数减少。
一般来说,伪随机数生成器应该只 在调用 rand() 和程序开始之前播种一次。 不应重复播种,或者每次您希望生成一批新的伪随机数时都重新播种。
phoxis对srand() — why call only once?的回复:
初始化一次,初始状态会产生种子值 足够的随机数,因为您没有使用 srand 设置内部状态, 从而使数字更有可能是随机的。
也许他们只是使用不精确的语言,似乎没有任何解释可以解释为什么多次调用 srand 是不好的(除了产生相同的随机数序列)或者它如何影响数字的“随机性” .有人可以帮我解决这个问题吗?
【问题讨论】:
-
本身:不。提供上下文,否则我们无法判断质量受到的影响程度。
-
@Columbo 对于严重使用,
srand存在多个问题。其中之一是分布有偏差。参见例如eternallyconfuzzled.com/arts/jsw_art_rand.aspx 进行一些讨论,虽然我记得我在 SO 上看到过类似的东西,虽然现在找不到。 -
@vsoftco 不相关?我们谈论的是质量的差异,而不是质量本身。
-
@Columbo 我提到偏向低位是一个问题,在我看来是最严重的问题。这是质量上的差异,并链接了一个页面,这在我的帖子中解释得很长。换句话说,源的熵与
H(|X|)相差甚远,|X|是字母表的大小。 -
@vsoftco 我们必须案例:种子兰特一次,种子兰特几次。现在我们担心生成的序列的质量差异。您以任何方式链接的页面与此问题有什么关系?