8

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

我试过了

srand((unsigned) time(0));

但它似乎在每次启动程序时给我一个随机数,但不是在每次执行函数本身时......

我正在尝试使用随机数、随机迭代、元素数等自动化一些测试......我想我可以打电话

srand((unsigned) time(0));

在我的测试功能和宾果游戏开始时,但显然不是。

你会建议我做什么?

4

3 回答 3

12

srand()

正如其他人所提到的。srand() 为随机数生成器提供种子。这基本上意味着它设置了随机数序列的起点。因此,在实际应用程序中,您希望调用一次(通常是您在 main 中做的第一件事(在设置区域设置之后))。

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

    // STUFF
}

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

单元测试

转向单元测试。在这种情况下,您真的不想要随机数。非确定性单元测试是浪费时间。如果一个失败,你如何重新产生结果以便你可以修复它?

您仍然可以在单元测试中使用 rand()。但是您应该初始化它(使用 srand()),以便在调用 rand() 时单元测试始终获得相同的值。所以测试设置应该在每次测试之前调用 srand(0) (或除 0 之外的某个常数)。

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

于 2010-12-02T03:52:45.533 回答
11

You need to call srand once per program execution. Calling rand updates the internal state of the random number generator, so calling srand again actually resets the random state. If less than a second has passed, time will be the same and you will get the same stream of random numbers.

于 2010-12-02T03:31:21.867 回答
5

srand is used to seed the random number generator. The 's' stands for 'seed'. It's called "seeding" because you only do it once: once it's "planted", you have a stream from which you can call rand as many times as you need. Don't call srand at the beginning of the function that needs random numbers. Call it at the beginning of the program.

Yes, it's a hack. But it's a hack with a very well-documented interface.

于 2010-12-02T03:31:51.650 回答