C++生成随机数的两种方法详解
创作时间:
2025-03-13 13:24:08
作者:
@小白创作中心
C++生成随机数的两种方法详解
引用
CSDN
1.
https://m.blog.csdn.net/unoreason/article/details/131655928
计算机所产生的随机数其实并不是真正随机的,而是伪随机的。当我们在使用rand()生成随机数时得到的实际上是从由随机数种子生成的一个数字序列中生成的一个数,该数字序列的长度一般是65535。也就是说一个固定的随机数种子生成的数字序列长度一般是65535,当我们在这个数字序列中生成随机数时,如果已经得到了65535个随机数那么接下来生成的随机数会和之前的随机数重复。简单点说就是如果不改变随机数种子的话,那么生成随机数的过程就是每次在一个固定的数字序列中拿出一个数(而且经过我多次试验发现每次还都是按顺序生成的,即有规律可循)。
使用cstdlib库
第一步:使用srand()设置随机数种子值(如果不设置的话会默认随机数种子为1即srand(1))。
用法:srand(unsigned int seed) //初始化随机数发生器
通常用srand(time(0))来初始化,time(0)为1970年1月1日到现在的秒数,这样在每次运行代码时可以使数字序列都不相同。
第二步:使用rand()产生随机数。
用法:rand() //随机数发生器
产生一定范围随机数的通用表示公式:
(1)要取得[a,b)的随机整数:(rand()%(b-a))+a;
(2)要取得[a,b]的随机整数:(rand()%(b-a+1))+a;
(3)要取得(a,b]的随机整数:(rand()%(b-a))+a+1; //通用公式:a+rand()%n:其中a是范围的起始值,n是整数的范围。
(4)要取得a到b之间的随机整数的另一种方式:a+(int)b*rand()/(RAND_MAX+1)
(5)要取得0~1之间的浮点数:rand()/double(RAND_MAX)
使用random库
在C++11以前,C和C++都使用相同的方式来生成随机数。而C++11提供了随机数库,其中包括随机数引擎类和随机数分布类。
随机数引擎类
//一般用default_random_engine类产生随机非负数(不推荐直接使用)
#include<iostream>
#include<ctime>
#include<random>
using namespace std;
int main(){
default_random_engine e;
e.seed(time(0));
for(int i=0;i<10;i++){
cout<<e()<<endl;
}
system("pause")
return 0;
}
输出结果:
随机数分布类
产生均匀分布的整数:uniform_int_distribution
#include<iostream>
// #include<cstdlib>
#include<ctime>
#include<random>
using namespace std;
int main(){
default_random_engine e;
uniform_int_distribution<int> u(1,10); //左闭右闭区间
e.seed(time(0));
for(int i=0;i<10;i++){
cout<<u(e)<<endl;
}
system("pause");
return 0;
}
输出结果:
产生均匀分布的实数:uniform_real_distribution
#include<iostream>
// #include<cstdlib>
#include<ctime>
#include<random>
using namespace std;
int main(){
default_random_engine e;
uniform_real_distribution<double> u(1.0,2.0); //左闭右闭区间
e.seed(time(0));
for(int i=0;i<10;i++){
cout<<u(e)<<endl;
}
system("pause");
return 0;
}
输出结果:
产生正态分布的实数:normal_distribution
#include<iostream>
// #include<cstdlib>
#include<ctime>
#include<random>
using namespace std;
int main(){
default_random_engine e;
normal_distribution<double> u(0,1); //均值为0,标准差为1
e.seed(time(0));
for(int i=0;i<10;i++){
cout<<u(e)<<endl;
}
system("pause");
return 0;
}
输出结果:
生成二项分布的布尔值:bernoulli_distribution
#include<iostream>
// #include<cstdlib>
#include<ctime>
#include<random>
using namespace std;
int main(){
default_random_engine e;
bernoulli_distribution u(0.6); //生成1的概率是0.6
e.seed(time(0));
for(int i=0;i<10;i++){
cout<<u(e)<<endl;
}
system("pause");
return 0;
}
输出结果:
参考内容
【小沐学C++】C++11 实现随机数生成(Windows、Linux)
C++ rand 与 srand 的用法
热门推荐
这份健康睡眠指南请收好|世界睡眠日
张雪峰评深圳理工大学:实力与优势专业全解析
用户体验创值:客诉降低成本会怎么变化?降低客诉需要哪些策略?
酯化反应:酯类化合物的合成与性质
耳鸣是怎麼回事?
5G信号塔对人体有危害吗
阀门维护与故障排除指南
报告:新型灵活就业需求规模占比持续扩大
全国冬至饭地图揭秘!五大流派 “食” 力交锋 你家乡属于哪一派?
秋田犬饲养指南:从住所到社交化的全方位养护要点
秋田犬饲养指南:从饮食到行为训练的全方位养护建议
如何跟装修团队沟通技巧
赔率应该如何刻画?兼论在反弹之后市场赔率是否还有吸引力
RPA教程:如何进行RPA机器人的框架设计?
不同类型的假期在请假制度中有哪些区别?
好发于儿童和年轻人的鸡皮样胃炎
使用密理博纯水机时,如何确保水质的稳定性和安全性?
分子人类学与考古学视角下的伏羲起源新解
探索华夏神话:上古五大创世神与女娲的传奇
在荒漠中创造绿色奇迹——中电建新能源甘肃分公司武威凉州治沙光伏项目建设纪实
如何组建维修服务团队
专家解读:血液透析患者容量和血压管理的关键要点
水质检测方法全解析:从感官判断到高科技监测
VScode配置自动代码格式化C/C++:从入门到实践
实习岗位对专业技能有哪些特定要求
探究研究与实验设计
何时最适合给宝宝洗澡?选择正确的时间进行沐浴。
轴承座常用的材料有哪些 如何选择轴承座材质
蜂王浆的营养价值
卫生间防水施工的关键步骤与详解!