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 的用法
热门推荐
王安石变法:革新之志与帝国衰亡的多维解析
送祝福!刘亦菲:从仙剑到玫瑰,20 年等待哲学如何破局流量时代
甄子丹的成名史,你想知道吗?
电脑电源适配器很烫怎么办?
从理论到实践:如何有效管理个人情绪
未成熟神经元,治疗大脑疾病的新可能
Nature揭示未成熟神经元终身存在,为研究神经系统疾病提供新思路
每天100个俯卧撑坚持一个月:肌肉增长、身体变化与健康风险分析
餐饮烧烤房屋的设计如何提升顾客就餐体验?
中国八大菜系代表菜大盘点:从川菜到徽菜,尽显中华美食魅力
水滴还能这样发电!解锁水伏发电技术新模式
STM32单片机学习:DHT11温湿度传感器使用详解
高原反应完全指南:症状、原因及科学缓解方法
理性思维,如何掌控人生?
字体设计的四个基本原则是什么?字体设计有哪些分类?
私藏干货!字体设计如何造型和搭配?
五指毛桃的栽培技术详解
南瓜的储存方法:从阴凉处到冷冻保存的全方位指南
不懂就问,怎么才能让家里的网速变得更快?
怠速控制阀坏了的表现
人力资源专员与猎头:职业发展路径的选择与分析
镶牙后多久可以正常饮食?镶牙后哪些东西不能吃?
镶牙后需要多长时间才能随意进食?了解镶牙后的饮食注意事项
笔记本电脑怎么连接蓝牙音响设备 5个步骤帮你连接
李放春:今天韦伯对中国学术还有启示意义吗?
如何理解股票套利的操作方法?这种操作方法有哪些风险?
标题写作技巧:如何打造吸引人的头条爆款文章?
小部件大作用:汽车火花塞的作用及养护指南
金蛇狂舞!和蛇相关的汽车品牌,你知道几个?
菲律宾首都马尼拉发展现状:与国内城市对比分析