标准库 <cstdlib> (被包含于 <iostream> 中)提供两个帮助生成伪随机数的函数:

函数一:int   rand(void);
从srand   (seed)中指定的seed开始,返回一个[seed,   RAND_MAX(0x7fff))间的随机整数。

函数二:void   srand(unsigned   seed);
参数seed是rand()的种子,用来初始化rand()的起始值。

可以认为rand()在 每次被调用的时候,它会查看:
1) 假如用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用
srand(seed) 一次来初始化它的起始值。
2) 假如用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。

根 据上面的第一点我们可以得出:
1) 假如希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比 如到目前为止流逝的时间)。
2) 否则,假如给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样,虽然这个值会是[seed,   RAND_MAX(0x7fff))之间的一个随机取得的值。
3) 假如在调用rand()之前没有调用过srand(seed),效果将和调用了srand(1)再调用rand()一样(1也是一个定值)。

举 几个例子,假设我们要取得0~6之间的随机整数(不含6本身):

例一,不指定seed:
for(int   i=0;i <10;i++){
ran_num=rand()   %   6;
cout < <ran_num < < "   ";
}
每次运行都将输出:5   5   4   4   5   4   0   0   4   2

例二,指定seed为定值1:
srand(1);
for(int   i=0;i <10;i++){
ran_num=rand()   %   6;
cout < <ran_num < < "   ";
}
每次运行都将输出:5   5   4   4   5   4   0   0   4   2
跟例子一的结果完全一样。

例三,指定seed为定值6:
srand(6);
for(int   i=0;i <10;i++){
ran_num=rand()   %   6;
cout < <ran_num < < "   ";
}
每次运行都将输出:4   1   5   1   4   3   4   4   2   2
随机值也是在[0,6)之间,随得的值跟srand(1)不同,但是每次运行的结果都相同。

例四,指定seed为当前系统流逝了的时间(单位为 秒):time_t   time(0):
#include   <ctime>
//…
srand((unsigned)time(0));
for(int   i=0;i <10;i++){
ran_num=rand()   %   6;
cout < <ran_num < < "   ";
}
第一次运行时输出:0   1   5   4   5   0   2   3   4   2
第二次:3   2   3   0   3   5   5   2   2   3
总之, 每次运行结果将不一样,因为每次启动程序的时刻都不同(间隔须大于1秒?见下)。

关于time_t   time(0):

time_t 被定义为长整型,它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。比如假设输出:
cout < <time(0);
值约为1169174701,约等于37(年)乘365(天)乘24(小时)乘3600(秒)(月日没算)。

另 外,关于ran_num   =   rand()   %   6,

将rand()的返回值与6求模是必须的,这样才能确保目的随机 数落在[0,6)之间,否则rand()的返回值本身可能是很巨大的。
一个通用的公式是:
要取得[a,b)之间的随机整数,使用(rand()   %   (b-a))+   a   (结果值将含a不含b)。
在a为0的情况下,简写为rand()   %   b。

最 后,关于伪随机浮点数:

用rand()   /   double(RAND_MAX)可以取得0~1之间的浮点数(注重,不同于整型时候的公式,是除以,不是求模),举例:
double   ran_numf=0.0;
srand((unsigned)time(0));
for(int   i=0;i <10;i++){
ran_numf   =   rand()   /   (double)(RAND_MAX);
cout < <ran_numf < < "   ";
}
运行结果为:0.716636,0.457725,…等 10个0~1之间的浮点数,每次结果都不同。

假如想取更大范围的随机浮点数,比如1~10,可以将
rand()   /(double)(RAND_MAX)   改为   rand()   /(double)(RAND_MAX/10)
运行结果 为:7.19362,6.45775,…等10个1~10之间的浮点数,每次结果都不同。
至于100,1000的情况,如此类推。

以 上不是伪随机浮点数最好的实现方法,不过可以将就着用用…

转载于:https://www.cnblogs.com/madfrog/archive/2010/07/06/1772448.html

rand()和srand()产生伪随机数zz相关推荐

  1. c语言随机数猜字,玩猜字游戏顺便理解c语言的伪随机数(rand,srand)

    随机数 要想要产生真正的随机数,需要先来了解下面几个函数. rand()函数 C 库函数 int rand(void) 返回一个范围在 0 到 RAND_MAX 之间的伪随机数. RAND_MAX 是 ...

  2. 【C++】random随机数与【C++11】/rand()和srand()的用法

    文章目录 随机数 1. c++ 11 random随机数的使用(推荐使用) 1.1 1.2 1.3 1.4 2.1 C++中随机函数rand()和srand()的用法(老本版) 2.2 限制随机数的范 ...

  3. rand()和srand()关系很简单——一看就明白(通过一个可移植的源码)

    1 函数rand和srand实现及描述 #include <stdlib.h> //供rand()使用的种子数,初值为1 unsigned long int next = 1; /* * ...

  4. rand和srand

    rand()和srand()函数我们应该接触的比较多了,之前就遇到过,弄懂了,但是现在又忘了.再次遇见写篇文章记录一下. srand()用来设定一个随机数种子,其参数必须是整数,不同的随机数种子使ra ...

  5. C++中随机函数rand()和srand()的用法

    一.rand() 函数名:   rand      功   能:   随机数发生器    用   法:   int rand(void); 所在头文件: stdlib.h 函数说明 : rand()的 ...

  6. C语言随机数:rand()和srand(time(NULL))的使用

    C语言随机数 rand()简介 srand()简介 使用 rand()简介 使用该函数首先应在开头包含头文件<stdlib.h> #include<stdlib.h> //(C ...

  7. 【C语言】随机数函数rand和srand

    文章目录 一.随机数函数 1.rand().srand() 2.time() 二.案例实现 1.案例描述 2.代码实现 一.随机数函数 1.rand().srand() C语言产生随机数要用到的函数是 ...

  8. rand和srand的用法(转载)

    首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数) 表头文件: #include<stdlib.h&g ...

  9. rand()和srand()函数的用法

    一.rand() rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的. rand()会返回一个范围在0到RAN ...

最新文章

  1. hdu 2087 剪花布条
  2. 基于Smiles2vec预测化合物物理性质
  3. 动画专业艺术里最懂计算机的,美国数字媒体艺术专业了解一下!
  4. android获取button宽度,android – 如何获得Button的高度和宽度
  5. oppoJava面试题,java声明全局变量的关键字
  6. 输入一颗二元树,从上向下按层打印树的每个节点,同一层中,按照从左到右的顺序打印。...
  7. Vue插件_自己封装插件_以及使用自定义插件---vue工作笔记0017
  8. mysql如何安装 centos7_如何解决centos7上mysql安装及问题
  9. NUC1154 Vertical Histogram【打印图案】
  10. iptables(3)
  11. 前端解析ipa、apk安装包信息 —— app-info-parser
  12. XLSTransformer生成excel文件简单演示样例
  13. matlab imnoise 用法,使用matlab的imnoise添加噪声
  14. js实现实时的时间显示
  15. 微信开放平台申请方法与用途
  16. nginx 499状态码
  17. 企业降低包装成本的13种简单方法(下篇)
  18. mac系统docker发布镜像报错:错误the user name or passphrase you entered is not correct解决
  19. 2018年最流行的5大开源项目
  20. python中的copy.deepcopy()

热门文章

  1. 刚刚,谷歌宣布TPU全面开放,AI芯片及云市场再迎变局
  2. Docker实战6 之构建自己的docker镜像
  3. c#操作json 使用JavaScriptSerializer
  4. blob clob区别
  5. openstack版本历史
  6. 你好,欢迎来到我的空间,
  7. C# ToString() 参数大全
  8. 每天一记 10.03.26
  9. C#相等性 - 三个方法和一个接口
  10. 2018程序员必备的4大网站推荐(代码、编程、SQL等)