随机数rand-如何正确生成随机数

#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\n", rand() );//无论是否有种子,3个随机数都不一定会相同.

printf("%d\n", rand() );

printf("%d\n", rand() );

printf("====================\n");

//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.

 

posted @ 2017-02-15 11:01  SuperYang  阅读(937)  评论(0编辑  收藏  举报