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()初始化种子,两个函数有区别的.
- 函数rand()与srand()
- rand() 与srand() 函数
- rand 函数 与 srand 函数
- rand函数与srand函数
- srand函数与rand函数
- rand()与srand()函数用法详解
- rand()与srand()函数的使用
- srand() rand()函数
- rand()、srand()函数用法
- srand和 rand函数.
- rand()和srand()函数
- rand()和srand()函数
- rand()和srand()函数
- rand()和srand()函数
- 随机数函数-rand(),srand()
- rand()/srand()随机函数
- rand()和srand()函数
- 随机数函数rand/srand
- 升级到Xcode7.0 不能联网的问题
- Linux平台上最常用的翻译工具—StarDict(星际译王)。
- Android设计模式系列(8)--SDK源码之工厂方法模式
- iOS动画
- Reverse Linked List II | Java最短代码实现
- rand() 与srand() 函数
- 《加州理工学院公开课:机器学习与数据挖掘》第2讲学习笔记
- Android 编程下获得应用程序的签名
- CommandButtonとactionFunction
- 初涉bootstrap:bootstrap 插件
- 编译kernel perl版本bug
- Java中abstract和interface的区别
- Head First设计模式之装饰者模式(Decorator Pattern)
- Android Studio使用笔记(1)使用android studio时避免每次启动都进行网络gradle sync的方法