#include <stdio.h>
//#include <Windows.h>
int main(void)
{
int i;
//srand((unsigned)time(NULL));//每次运行该程序时,如果当前秒数不同,则不同次运行生成的随机数不同,
for (i = 0; i < 20; i++) // 否则不同次运行生成的随机数是一样的
{
//srand(_getpid());
srand((unsigned)time(NULL));//每次运行该程序时,如果当前秒数不同,则不同次运行生成的随机数不同,
printf("%d ", rand() );//无论是否有种子,3个随机数都不一定会相同.
printf("%d ", rand() );
printf("%d ", rand() );
printf("==================== ");
//system("pause");
}
return 0;
}
结果:每次循环产生的随机数一样.如下图所示.
rand 是固定的迭代函数,对一个初始值不停嵌套计算,输出每次计算的结果。输出的序列有不错的统计性质,所以叫伪随机数。srand 就是设置这个初始值。不停地设置相同的初始值,rand 就总是初始值经过一次计算的结果,也就不会变。这是错误的用法。
正确的用法,srand 一个程序只能调用一次。或者说一个线程只调用一次(对于常见的每个线程一个随机数发生器状态的 C 运行时库)。
1.综上所述,注释掉for循环中的srand((unsigned)time(NULL)),使用for上一行的srand((unsigned)time(NULL)).
2.time(NULL)每秒变化一次,如果在一秒内连续执行该程序2次,则2次得到的随机数一样.这时,可以使用_getpid()代替time(NULL)._getpid()(VS2015,LINUX下为getpid()),获取进程ID.