有关随机数生成的疑问
void main()
{
srand(time(0));
for(int i=0;i <10;i++)
cout < <rand() < <endl;
}
如此可以生成10个随机数
但这样的话
for(int i=0;i <10;i++)
{
srand(time(0));
cout < <rand() < <endl;
}
便生成相同的随机数了,这是为什么???
[解决办法]
随机数算法可以认为是下面的函数:
y = func(x0, n);
其中x0是初始种子,在这里可以认为就是当前的时间(可能精确到毫秒什么的);
n是调用随机函数的次数。
上面第二种做法中,使得每一次x0都相同,n都是1,所以结果都相同。
正确的做法是在程序最开始调用一次srand,使得每一次运行时x0都不同,每一次中凭借n不同使得各个数字不同,从而达到最大的随机效果。
[解决办法]
第二种相同是因为电脑计算的整度是很快的,于是每次循环中你用到的种子都是一样的。
而第一种只初始化一次随机种子,下次它直接在内部保存上次的结果做种子。
[解决办法]
void main()
{
srand(time(0));
for(int i=0;i <10;i++)
cout < <rand() < <endl;
}
如此可以生成10个随机数。因为以当前时间为种子产生一个随机数序列,然后for在该序列中随机的取10次,当然不会重复,或者说重复的概率非常下。
for(int i=0;i <10;i++)
{
srand(time(0));
cout < <rand() < <endl;
}
10次都相同,因为循环执行了10的速度是非常快的,每次的srand(time(0));基本都是在一个时间点上,所以产生的10列随机数序列都是一样的,取到的位置是不变的,所以就相同喽!
[解决办法]
rand();是伪随机数来的,srand();相当于为rand()找到一个随机数的起点
第一个中,定下了一个起点之后,顺序拿下面10个随机数,所以生成了10个不同的随机数。
第二个例子中,每次拿随机数,都是从同样一个起点(srand(time(0))拿,拿到的当然是相同的数字啦