我正在创建一个简单的程序来模拟我班级的抛硬币.(实际上,课程已超过这个学期,我只是在完成其他不需要的项目).它涉及创建和调用一个生成1到2之间随机数的函数.最初,我试图在将要使用它的函数中使用随机数生成器(coinToss); 但是,它没有产生随机数.每次运行程序时,它都与我使用过的数字相同
rand()
代替
unsigned seed = time(0);
srand(seed);
rand();
Run Code Online (Sandbox Code Playgroud)
然而,当我在上面移动时
int main()
Run Code Online (Sandbox Code Playgroud)
它工作得很好.
我的问题是1)为什么在调用它的函数中进行设置时它不起作用?(2)如果它们不同时出现在同一个函数中,如何rand()
访问所做的srand()事情?显然,我是初学者,如果我没有正确地提出问题,请原谅我.此外,我的书只是简单地触及rand(),srand()所以我真的知道.
谢谢你的帮助!
相关代码:
第一次尝试不起作用:
int main()
{
//...........
coinToss();
//...........
}
int coinToss()
{
unsigned seed = time(0);
srand(seed);
return 1 + rand() % 2;
}
Run Code Online (Sandbox Code Playgroud)
第二次尝试工作:
int main()
{
unsigned seed = time(0);
srand(seed);
coinToss();
}
int coinToss()
{
return 1 + rand() % 2;
}
Run Code Online (Sandbox Code Playgroud)
您可能只希望为随机数生成器播种一次.rand()从它的内部生成器返回下一个伪随机数.每次打电话给rand()你都会从内部发电机获得下一个号码.
srand()但是设置随机数发生器的初始条件.您可以将其视为为内部随机数生成器设置"起始点"(实际上它比这复杂得多,但它是一个有用的认知模型).
所以,你应该srand(time(0))在你的应用程序中调用一次 - 接近开头的某个地方.之后,您可以rand()根据需要多次拨打电话!
然而
要回答您的实际问题 - 第一个版本不起作用,因为time()返回自纪元以来的秒数.所以,如果你coinToss()在第二个(比方说,如果你想模拟100次硬币投掷)几次,那么你会不断地播种与相同数量的随机数发生器,由此重置它的内部状态(因此下一个号码,你得到)每次.
无论如何 - time()因为srand()这个原因,使用作为种子有点蹩脚 - time()不经常变化,更糟糕的是,它是可预测的.如果您知道当前时间,您可以确定rand()将返回的内容.互联网有很多很好的srand()种子例子.
| 归档时间: |
|
| 查看次数: |
11001 次 |
| 最近记录: |