概论

百度百科给出的随机数的定义是:“随机数是专门的随机试验的结果”。当我们需要完成一个类似于抽奖的程序时,我们往往会借助随机数来实现目标,但实际情况下,计算机只能给我们提供伪随机数。
所谓伪随机数,“是按照一定算法模拟产生的,其结果是确定的,是可见的”。计算机产生随机数的过程,是根据一个种子为基准,以某个递推公式推算出来的一系列数,当递推的范围足够大、往复性足够强、又符合正态分布或平均分布时,我们就可以认为这是一个近似的真随机数
c语言中,头文件stdlib.h(c++中是cstdlib)为我们提供了rand函数来生成随机数和srand()来提供随机数种子。
所谓种子可以看作随机数序列的名字,一个种子对应一串随机数序列,当种子不变时,就会按照随机数序列依次输出随机数。

实例

1.默认种子

#include<cstdlib>
#include<iostream>
using namespace std;
#define max 1
#define min 10
int main()
{int i;for(i=0;i<10;i++){cout<<rand()<<endl;//生成随机数}return 0;
}

结果:
41
18467
6334
26500
19169
15724
11478
29358
26962
24464
这个代码没有指定种子,所以第一次请求时,种子被设置为1,这个我们等一下可以看到

2.为种子赋值

2.1 循环内定种子

void Rand21(){int i;for(i=0;i<10;i++){srand(1);cout<<rand()<<endl;}
}

41
41
41
41
41
41
41
41
41
41
这次的输出结果是是个41,因为我们在每一次输出随机数之前都为种子赋值,我们也可以知道,如果种子是默认值1,那么随机数序列的第一个值是41

2.2 循环外定种子

void Rand22(){int i;srand(1);for(i=0;i<10;i++){cout<<rand()<<endl;}
}

输出结果和第一类一致,原因是默认的种子就是1,因此如果我需要产生更类似于真随机的随机数,我们就需要让种子也变得“随机”

2.3 循环外不定种子

void Rand231(){int i;srand(time(NULL));for(i=0;i<10;i++){cout<<rand()<<endl;}
}

输出结果请大家自己测试,如果测试的频率很高的话,会发现各次数据的情况非常类似,数值之间的间隔也小,这就是由于时间相近导致的种子之间的差异小,随机数序列的差异也小

因此我们套用两次进行运算。

void Rand232(){int i,j;srand(time(NULL));j=rand()+rand();srand(j);for(i=0;i<10;i++){cout<<rand()<<endl;}
}

每次测试的结果之间的差距就大了很多,多次使用的随机样本更趋近于“真随机”。

3.常见的取随机值的方法

3.1 在1~n之间取随机数

void Rand31(){int i,n;cin>>n;for(i=0;i<10;i++){cout<<1+(int)(n*rand()/RAND_MAX<<endl;}
}//本样例用默认种子

原理是rand()函数的取值范围是1~32767,所以对随机生成的数值对应比例缩小或放大,即可实现

3.2 random(int)函数

random(int)函数和rand(void)函数的区别显而易见,random(int)函数输出的是指定范围内的随机数,而相同点是也可以用randomSeed()来制定种子
但需要注意的是,random函数不是标准库函数,vc、g++等编译器是不能识别的

3.3通用随机数公式

3.3.1 a~b之间的随机数

前文所使用的公式

a+(int)(b-a)*rand()/(RAND_MAX+1)//左闭右开
a+(int)(b-a)*rand()/RAND_MAX//闭合区间

对这个公式进行改良得到

rand()%(b-a)+a//开闭区间为左闭右开
rand()%(b-a)+a+1//开闭区间为左闭右开
rand()%(b-a+1)+a//开闭区间为闭区间

再由上面我们可以得到a~a+n的通用公式

a+rand()%n//这个函数的区间问题请大家参考上面来思考

3.3.2 0~1的小数

rand()/(double)RAND_MAX

由此推得a~a+1之间的小数

rand()/(double)RAND_MAX+a

在向外发展,结合3.3.1,a~b之间的小数

rand()/(double)RAND_MAX+rand()%(b-a)+a

总结

以下要点需要在编写随机数程序过程中牢记
1.rand函数的生成结果由种子决定,种子默认为1
2.种子如果一定,那么随机的结果就会在完成一次循环后重复这一过程
3.即使不断的选取种子,所产生的数值都是伪随机,计算机无法实现真正的“真随机”

最后希望大家以后搞小活动的时候,如果需要随机数生成器,能自己编写一次属于自己的生成器,加个善意的小后门来做个小惊喜。

【学习笔记】C语言 随机数的生成原理分析和各类随机数公式相关推荐

  1. c语言学习进阶-C语言程序实现生成指定区间指定个数随机数

    ##C语言程序实现生成指定区间指定个数随机数 设计一个自动数据生成程序,能自动生成指定行数的随机整数并写入到一个文件当中,随机整数的范围可以被控制,例如控制在0 到100 间,这个程序的操作命令行参数 ...

  2. C语言学习笔记---001C语言的介绍,编译过程原理,工具等

    C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...

  3. nltk和python的关系_NLTK学习笔记(一):语言处理和Python

    目录 nltk资料下载 import nltk nltk.download() 其中,download() 参数默认是all,可以在脚本里面加上nltk.download(需要的资料库) 来进行下载 ...

  4. Python3《机器学习实战》学习笔记(八):支持向量机原理篇之手撕线性SVM

    原 Python3<机器学习实战>学习笔记(八):支持向量机原理篇之手撕线性SVM 置顶 2017年09月23日 17:50:18 阅读数:12644 转载请注明作者和出处: https: ...

  5. IOS学习笔记05---C语言程序的开发运行过程

    IOS学习笔记05---C语言程序的开发运行过程 0 5.C语言3-C语言程序的开发运行过程 ----------------------------------------------------- ...

  6. Altium Designer 2020 学习笔记(一)-----原理图及原理图库部分(配动态图操作演示)

    本篇文章主要与大家简要分享一下,我在AD学习过程中的一些学习笔记,本篇文章主要关于原理图及原理图库部分. 本系列文章链接: -------------------------------------- ...

  7. cv学习笔记(3)神经网络数学原理

    cv学习笔记(3)神经网络数学原理 根据一个神经网络例子来介绍 输入是年龄.收入.性别,输出是买车和不买车的概率.该神经网络包含一个输入层.一个隐含层.一个输出层,每个节点和下一层的所有节点都有连接, ...

  8. IOS学习笔记07---C语言函数-scanf函数

    2013/8/7 IOS学习笔记07---C语言函数-scanf函数 ------------------------------ qq交流群:创梦技术交流群:251572072            ...

  9. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  10. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

最新文章

  1. 编译osdrv的uboot 内核 文件系统(Hi3516a)
  2. python3 打印异常堆栈信息
  3. 第二期冲刺站立会议个人博客15(2016/6/08)
  4. 若依前后端分离版怎样根据数据库生成代码并快速实现某业务的增删改查
  5. oracle 取整的几种方法
  6. Integer对象范围(-128-127)之间(Integer. valueOf()方法)
  7. leetcode 300. 最长上升子序列
  8. mysql 搜索正则表达式_mysql必知必会--用正则表达式 进行搜索
  9. SQL语句将表中数据导入到另一个数据库表中
  10. 大数据在农业农村的应用
  11. Spark算子:RDD键值转换操作(5)–leftOuterJoin、rightOuterJoin、subtractByKey
  12. python卸载指令_如何卸载python插件
  13. 信道编码技术——卷积码编码与译码
  14. RUST开服教程、常用指令及心得
  15. matlab 对数回归,[线性模型] 对数几率回归(Logistic Regression)
  16. 三段论--正向演绎推理
  17. RabbitMQ高可用集群搭建
  18. 嵌入式主板分类及优点
  19. 细节决定孩子成长的成败
  20. 圆满收官,百花齐放!2022企业级低代码应用大赛获奖结果公布

热门文章

  1. 实验室信息化管理系统LIMS手机端二维码应用
  2. 大数据导论2之大数据与云计算、物联网、人工智能
  3. 操作系统经典书籍推荐
  4. 水星怎么设置网速最快_水星怎么设置路由器的网速
  5. HCIA~广域网技术
  6. C语言中将二进制转换成十进制
  7. 为什么在不同网站查询本机的公网IP不一样?
  8. 《东周列国志》第十一回 宋庄公贪赂构兵 郑祭足杀婿逐主
  9. px4 Linux下环境的配置 gcc-arm装不上 OpenGL=3.1 问题
  10. 找到解决办法了,特回来写总结,the import cannot be resolved问题可以通过以下方法解决