rand()和srand()产生伪随机数zz
函数一: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相关推荐
- c语言随机数猜字,玩猜字游戏顺便理解c语言的伪随机数(rand,srand)
随机数 要想要产生真正的随机数,需要先来了解下面几个函数. rand()函数 C 库函数 int rand(void) 返回一个范围在 0 到 RAND_MAX 之间的伪随机数. RAND_MAX 是 ...
- 【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 限制随机数的范 ...
- rand()和srand()关系很简单——一看就明白(通过一个可移植的源码)
1 函数rand和srand实现及描述 #include <stdlib.h> //供rand()使用的种子数,初值为1 unsigned long int next = 1; /* * ...
- rand和srand
rand()和srand()函数我们应该接触的比较多了,之前就遇到过,弄懂了,但是现在又忘了.再次遇见写篇文章记录一下. srand()用来设定一个随机数种子,其参数必须是整数,不同的随机数种子使ra ...
- C++中随机函数rand()和srand()的用法
一.rand() 函数名: rand 功 能: 随机数发生器 用 法: int rand(void); 所在头文件: stdlib.h 函数说明 : rand()的 ...
- C语言随机数:rand()和srand(time(NULL))的使用
C语言随机数 rand()简介 srand()简介 使用 rand()简介 使用该函数首先应在开头包含头文件<stdlib.h> #include<stdlib.h> //(C ...
- 【C语言】随机数函数rand和srand
文章目录 一.随机数函数 1.rand().srand() 2.time() 二.案例实现 1.案例描述 2.代码实现 一.随机数函数 1.rand().srand() C语言产生随机数要用到的函数是 ...
- rand和srand的用法(转载)
首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数,下面将详细说明. rand(产生随机数) 表头文件: #include<stdlib.h&g ...
- rand()和srand()函数的用法
一.rand() rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的. rand()会返回一个范围在0到RAN ...
最新文章
- hdu 2087 剪花布条
- 基于Smiles2vec预测化合物物理性质
- 动画专业艺术里最懂计算机的,美国数字媒体艺术专业了解一下!
- android获取button宽度,android – 如何获得Button的高度和宽度
- oppoJava面试题,java声明全局变量的关键字
- 输入一颗二元树,从上向下按层打印树的每个节点,同一层中,按照从左到右的顺序打印。...
- Vue插件_自己封装插件_以及使用自定义插件---vue工作笔记0017
- mysql如何安装 centos7_如何解决centos7上mysql安装及问题
- NUC1154 Vertical Histogram【打印图案】
- iptables(3)
- 前端解析ipa、apk安装包信息 —— app-info-parser
- XLSTransformer生成excel文件简单演示样例
- matlab imnoise 用法,使用matlab的imnoise添加噪声
- js实现实时的时间显示
- 微信开放平台申请方法与用途
- nginx 499状态码
- 企业降低包装成本的13种简单方法(下篇)
- mac系统docker发布镜像报错:错误the user name or passphrase you entered is not correct解决
- 2018年最流行的5大开源项目
- python中的copy.deepcopy()