运行时的随机种子

8

如何在运行时生成不同的随机数?

我尝试过以下方法:

srand((unsigned) time(0));

但是在每次程序启动时似乎会得到一个随机数,但并不是在每次执行函数本身时都会得到随机数...

我正在尝试使用随机数、随机迭代、元素数量等来自动化一些测试... 我以为我只需要调用

srand((unsigned) time(0));

在我的测试函数开头加上bingo,但显然没有用。你会建议我做什么?
3个回答

12

srand()

正如其他人提到的一样,srand()用于种子随机数生成器。它基本上是设置随机数序列的起点。因此,在实际应用中,您只需要调用它一次(通常是在设置本地环境后的主函数中第一件要做的事情)。

int main()
{
    srand(time(0));

    // STUFF
}

现在,当你需要一个随机数时,只需调用rand()。

单元测试

转向单元测试。在这种情况下,您真的不希望有随机数。非确定性的单元测试毫无意义。如果一个失败了,你怎么能重现结果以便修复它呢?

你仍然可以在单元测试中使用rand()。但是,你应该初始化它(用srand())使得当调用rand()时,单元测试总是得到相同的值。所以,在每个测试之前,测试设置应该调用srand(0) (或一些其他常量)。

你需要在每个测试之前调用它的原因是,这样当你调用单元测试框架运行一个测试(或一组测试)时,它们仍然使用相同的随机数。


我正在进行的测试并不是真正的单元测试... 它只是一个限流测试,以了解通常的处理过程,以获取概述... - Pacane

11

您需要在程序执行期间仅调用一次srand。调用rand会更新随机数生成器的内部状态,因此再次调用srand实际上会重置随机状态。如果不到一秒钟的时间过去,时间将是相同的,并且您将获得相同的随机数流。


5
srand用于生成随机数发生器的种子。's'代表'seed',即种子。它被称为“种植”,因为你只需要执行一次:一旦“种植”完成,你就可以从中获取一个流,并调用rand任意次数。不要在需要随机数的函数开头调用srand。请在程序开始时调用它。
是的,这是一种hack方式。但它有一个非常好的文档接口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接