如何在运行时生成不同的随机数?
我试过
srand((unsigned) time(0));
但它似乎在程序的每次启动时都会给我一个随机数,但不是每次执行函数本身都会得到...
我正在尝试使用随机数,随机迭代,元素数等自动化一些测试...我想我可以调用
srand((unsigned) time(0));
在我的测试功能和宾果游戏的开头,但显然不是。
你建议我做什么?
答案 0 :(得分:11)
每个程序执行需要调用一次srand。调用rand更新随机数生成器的内部状态,因此再次调用srand实际上会重置随机状态。如果时间不到一秒,时间将相同,您将获得相同的随机数流。
答案 1 :(得分:10)
正如其他人所说。 srand()播种随机数生成器。这基本上意味着它设置了随机数序列的起点。因此,在一个真实的应用程序中,你想要调用它一次(通常是你在main中做的第一件事(就在设置语言环境之后)。)
int main()
{
srand(time(0));
// STUFF
}
现在当你需要一个随机数时,只需调用rand()。
转向单元测试。在这种情况下,你真的不想要随机数字。非确定性单元测试是浪费时间。如果一个失败,你如何重新产生结果,以便你可以解决它?
你仍然可以在单元测试中使用rand()。但是你应该初始化它(使用srand()),以便单元测试始终在调用rand()时获得相同的值。因此,测试设置应该在每次测试之前调用srand(0)(或者除0以外的某个常量)。
在每次测试之前需要调用它的原因是,当你调用单元测试框架来运行一个测试(或一组测试)时,它们仍然使用相同的随机数。
答案 2 :(得分:5)
srand
用于为随机数生成器播种。 's'代表'种子'。它被称为“播种”,因为你只做了一次:一旦它被“种植”,你有一个流,你可以根据需要多次调用rand
。不要在需要随机数的函数的开头调用srand
。在程序的开头调用它。
是的,这是一个黑客攻击。但这是一个有着良好文档界面的黑客攻击。