【发布时间】:2014-02-12 11:16:41
【问题描述】:
为什么当我在 2 个非常不同的点调用 srand() 时会导致数字不是随机的?一旦我删除其中一个,它就会恢复正常。
【问题讨论】:
-
你必须展示一些代码来说明你的意思,并用“非随机”来描述你的意思。
rand()是一个伪-随机数生成器;它生成的数字序列完全取决于最近对srand()的调用。
标签: c++ visual-c++ random srand
为什么当我在 2 个非常不同的点调用 srand() 时会导致数字不是随机的?一旦我删除其中一个,它就会恢复正常。
【问题讨论】:
rand() 是一个伪-随机数生成器;它生成的数字序列完全取决于最近对srand() 的调用。
标签: c++ visual-c++ random srand
这取决于您如何称呼它。 srand() 的目的是播种rand() 使用的伪随机数生成器。所以当你调用srand(i) 时,它会将rand() 初始化为一个依赖于i 的固定序列。因此,当您使用相同的种子重新播种时,您会开始获得相同的序列。
最常见的用例是只为生成器播种一次,并使用合适的“随机”值(例如惯用的time(NULL))。这个保证让你很可能在不同的程序执行中得到不同的伪随机数序列。
但是,有时您可能想要使伪随机序列“可重放”。想象一下,您正在对随机数据测试几种排序算法。为了获得公平的比较,您应该在完全相同的数据上测试每个算法 - 这样您就可以在每次运行之前使用相同的种子重新播种生成器。
换句话说:如果您希望数字只是伪随机的,请播种一次,并使用尽可能随机的值。如果您想要一些控制和可重玩性,请根据需要播种。
【讨论】:
srand (seed);
使用相同种子的两个不同初始化将生成 在后续调用 rand 时会产生相同的连续结果。
如果种子设置为 1,则生成器将重新初始化为其初始值 值并产生与调用 rand 或之前相同的值 srand。
每次 rand() 使用 srand() 播种时,它必须产生相同的结果 值序列。
【讨论】:
你在初始化 srand 吗?您必须在函数/代码的开头初始化它,如下所示:
srand(time(NULL));
它应该工作:)
【讨论】:
srand(time(NULL));,很快time(NULL) 返回与第一次完全相同的值时,您认为会发生什么?
time(NULL) 两次(或任何其他单位time_t 用于特定系统)。特别是如果程序不是一个复杂的程序,程序的完整运行甚至不需要花费一秒钟。
srand 被调用了。它被调用了两次。现在,假设您再次调用srand(time(NULL)),然后是rand(),然后是srand(time(NULL)),然后是rand()。这可能会给出两次相同的“随机”数字,因为time(NULL) 可能会给出两次相同的值。因此,再添加一个 srand(time(NULL)) 不会使 OP 受益。
您可以阅读有关伪随机数生成器的信息,标准库 srand-rand 函数是其中之一的实现。 核心思想是伪随机生成器用特殊的数字--seed初始化。 srand() 用于设置种子。对于每个种子伪随机生成器,都会生成完全相同的数字序列。通过使用不同的种子,您将获得不同的数字序列。 因此,如果您想在每次启动程序时获得不同的随机数,则每次都需要设置新的种子。 最简单的方法之一是将时间用于种子。
#include <time.h>
srand((unsigned int)time(0));
【讨论】: