rand() 与srand() 函数

来源:互联网 发布:linux nobody 用户 编辑:程序博客网 时间:2024/05/22 17:41

之前查了好几次这个函数,总是看了就忘,忘了再看,今天索性写在博客里,一来加深印象,二来希望帮助还在困惑的同学。

这两个函数是包含在同一个头文件下的,即常用的 #include <stdlib.n>头文件


vs里自带一个随机数生成函数:rand(),原型为:int rand(void);

使用的时候直接调用,它会返回一个随机数,但是,当你再次调用的时候,会发现这次生成的随机数跟上次一模一样。

这是为什么呢,因为我们没有为rand()函数设置种子,它使用的是默认的种子(默认为1),再通过一定的随机数生成算法,就得到了“随机数”,因为种子固定,随机数生成算法固定,所以生成的随机数也是(顺序)固定的,成了伪随机数。ps:种子与随机数的关系可详见http://zhidao.baidu.com/link?url=zlTpRW9b6nEf9zajsOthfPBqtC2LtrGsRTxmBr3Aw3iyXjP7oo2vNf-LUlikrQL2YXzBywY2ZQh7kTj1nnNVNq


所以,我们自然会想到,如果每次设置的种子不一样,是不是生成的随机数就不是固定的了呢?结果的肯定的!如果不怕麻烦的话,我们可以每次使用rand()函数前都手工设置下种子,当然有的人才懒得手工修改呢,怎么办呢?我们首先需要一个时刻变化的数作为种子,然后请srand()函数将该变化的数设为种子,这样就ok了。

srand()函数的原型为:void srand (unsigned int seed);

可以利用vs中的time()函数(头文件time.h)为我们返回一个不断变化的数作为种子,原型为:time_t  time(time_t * timer); // time_t 实际上就是长整型long int; 他用来保存从1970年1月1日0时0分0秒到现在时刻的秒数!当参数不为NULL时 需要的是一个time_t*类型的指针,得到的时间值会存在其中,否则只是作为返回值.

srand的常用形式:srand (  time(0) ); // 这样就完成了将time(0)这个数初始化为种子的任务了。


现在就可以生成真正的随机数了:

#include<stdlib.h>

#include<time.h>

void main()

{

srand( time(0) );

printf(" a random number is %d\n", rand() );

}

如果要生成0~N之间的随机数只需将上述语句中的rand()改为rand()%N就行了。


总结,

rand()可以生成随机数,但是其种子是固定的(为1);

srand()初始化种子,两个函数有区别的.




0 0