C++生成随机数的两种方法详解
创作时间:
作者:
@小白创作中心
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 的用法
热门推荐
双歧杆菌三联和四联有什么区别?
年末聚会穿搭:名媛风让你成为焦点
春节走亲戚,如何有效加强家庭纽带?
春节拜年礼仪,教你如何送礼显诚意
创意凉菜点亮你的年夜饭!8道寓意吉祥的开胃小菜
增程式电动汽车是什么?一篇文章看懂增程式电动汽车
腊月二十六:传统习俗与现代庆祝的完美融合
腊月二十六,红烧肉安排上了!
腊月二十六,炖大肉的正确姿势
自制巧克力模具的方法
糖尿病并发症的预防与治疗
夏叔厨房主理人夏天:初心不改的美食匠人
爸妈必看:儿童护肤品、婴儿护肤霜选购全攻略
乐陵影视城揭秘《唐探1900》取景地
巧克力的变质原因与保存技巧
胆舒胶囊:胆囊炎治疗的新星
社区卫生服务:守护胆囊健康的“最后一公里”
酒驾判定标准全解析:从酒类量化到代谢时间
这些食品安全知识你了解吗?
一碗炒饭吃进ICU?警惕“炒饭综合征”!(关于蜡样芽孢杆菌)
蜡样芽孢杆菌食物中毒的主要症状及应对措施
食物中毒:类型、发病机制与预防措施
春节习俗的现代变迁:团圆与创新
2025年春节将至,这些传统习俗正在消失!
CSPON建设 | 重庆:支撑超大城市精细化治理的人口监测分析模型研究
酒驾醉驾,小心翻车!
如何正确认识肺结节?
耳鸣的治疗,没有“一刀切”的秘方
从可可豆到可可液、可可脂、可可粉:巧克力原料的制作工艺
办公室木炭取暖,小心一氧化碳中毒!