为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化

Why does the random number generator not randomize numbers in the void function but does in the main function?

本文关键字:随机化 函数 而在 main 数字 随机数生成器 void 为什么      更新时间:2023-10-16
#include <iostream>
#include <cstdlib> 
#include <iomanip>
#include <ctime>
using namespace std;
void coinToss();
int main()
{
cout << "How many times do you want to flip the coin?n";

int choice;

cin >> choice;
for (int i = 1 ; i <= choice; i++)
{
cout << "Rolling Dice # " << i << endl;
coinToss();
}
return 0;
}
void coinToss()
{

unsigned seed = time(0);

srand(seed);
int result;
result = (rand() % (2 - 1 + 1)) + 1;
if (result == 2)
cout << "Tailsn";
else
cout << "Headsn";
cout << endl;
}

当我这样做时,它不会随机化数字,只是一遍又一遍地给出相同的数字。但如果我把";unsigned see=时间(0(;srand(种子("在我的主函数中,它实际上是随机化的,并给出不同的数字?

通常使用线性反馈随机数生成器,使用种子初始化随机化器一次,然后使用同一种子多次调用rand((。对rand((的每次调用都将被保存,并在对rand的NEXT调用中使用-因此,自混合会创建";随机查找";数字-IE一个伪随机数生成器(PRNG(

|--------|
|  Seed  | Set Once
|________|
|
|--------|    v
| Rand() |---- Mix with seed or last rand()
|________|    |
^         v
|     |--------|
-----| Rand() |
|________|

如前所述,您正在为随机化器重新设置种子(重置它(,然后调用rand((EACH coinToss((。这将不允许rand((与之前对rand(,当您重置它时(的调用混合,因此不会产生随机数。你还必须意识到这是PESUDO随机数,即不是真正的随机性,只是看起来随机。。因此,代码可能会做各种不可靠的事情来产生这些看起来像伪随机的数字。

如果您使用的是c++11或更新版本,请考虑使用#include/mt19937随机数生成器,它比rand((/srand(

std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<double> dist(1.0, 10.0);
for (int i=0; i<16; ++i)
std::cout << dist(mt) << "n";