C++ - 运行时的随机种子

Pac*_*ane 7 c++ random seed

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

我试过了

srand((unsigned) time(0));
Run Code Online (Sandbox Code Playgroud)

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

我试图用随机数,随机迭代,元素数等自动化一些测试...我以为我可以打电话

srand((unsigned) time(0));
Run Code Online (Sandbox Code Playgroud)

在我的测试功能和宾果游戏的开头,但显然不是.

你建议我做什么?

dre*_*obb 11

每个程序执行需要调用一次srand.调用rand更新随机数生成器的内部状态,因此再次调用srand实际上会重置随机状态.如果时间不到一秒,时间将相同,您将获得相同的随机数流.


Mar*_*ork 11

srand()函数

正如其他人所说.srand()播种随机数生成器.这基本上意味着它设置了随机数序列的起点.因此,在一个真正的应用程序中,你想要调用它一次(通常是你在main中做的第一件事(就在设置语言环境之后)).

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

    // STUFF
}
Run Code Online (Sandbox Code Playgroud)

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

单元测试

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

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

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


Kar*_*tel 5

srand用于为随机数生成器播种.'s'代表'种子'.它被称为"播种",因为你只做了一次:一旦它被"种植",你有一个流,你可以rand根据需要多次拨打电话.不要srand在需要随机数的函数的开头调用.在程序开始调用它.

是的,这是一个黑客.但这是一个非常有文档的界面的黑客攻击.