C++库的随机数生成
C++库为我们提供了很多生成随机数的方法。
使用C的随机数生成法
先学过C语言,或者仅仅用C++做算法的人。对rand()是非常熟悉了。这个函数没有参数,生成0到RAND_MAX的随机数(RAND_MAX随环境可能是16位范围或32位范围)。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
main() {
srand(time(0)); // 以当前时间初始化随机数种子
for (int i = 0; i < 12; i++)
printf("%d ", rand());
printf("\n%d", RAND_MAX);
}
/* output:
54662053 670906658 1153043822 1421129869 1473191568 431426198 458863543 103837017 1196255552 740286342 625267246 1994847783
2147483647
*/
一般我们用当前unix时间(即time(0)的值)初始化随机种子,这样每次运行时种子都可以不同,保证每次运行得到不同的随机数结果。在我的机器上,RAND_MAX值为2147483647,即所有31位正数的范围。
使用C++的随机数生成法
C语言的rand函数功能还是太局限。在生成特定范围的数或者实数的时候很不方便。
C++提供了全新的方式使用随机数。首先,使用random头文件,可以定义一个default_ranbdom_engine
#include <random>
#include <iostream>
using namespace std;
main(){
default_random_engine a;
cout << "min: " << a.min() << endl;
cout << "max: " << a.max() << endl;
for (int i = 0; i < 12; i++)
cout << a() << ' '; //! 生成下一个数
}
/*
min: 1
max: 2147483646
16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709 823564440 1115438165
*/
这个“随机数引擎”是一个可调用对象,与rand()非常相似,不过在多线程时可以定义很多个一起用。同时也需要在构造时(或使用成员函数seed赋值种子,否则默认构造下种子相同,每次都会生成相同的随机数)。一般来讲,最好把它定义成静态或全局变量。如果作为局部变量的话,则每次都会从相同的种子重新开始。
//C++ Primer上的例子
auto random_vector() {
default_random_engine eng;
vector<int> a(12);
for (int i = 0; i < 12; i++) a[i] = eng();
}
/*
这个函数返回一个填充随机值的vector,但是他每次运行都会使用相同种子,生成完全一样的值。
把eng定义为static就可以解决这个问题。
或者也可以使用time(0),但time(0)是以秒为单位的,若调用太快仍会得到相同的结果
*/
除了随机数引擎,我们还可以使用随机数分布对象。分布对象可以用调用引擎生成随机数,再调整出适当范围内的随机数,比如下面这个:
main(){
default_random_engine a;
uniform_int_distribution<short> x(12, 90); //整数生成器
cout << "min: " << x.min() << endl;
cout << "max: " << x.max() << endl;
for (int i = 0; i < 12; i++)
cout << x(a) << ' '; //! 生成下一个数
}
/*
min: 12
max: 90
12 22 71 48 54 29 15 65 65 85 42 53
*/
uniform_int_distribution可以指定任意整数类型和上下界值(闭区间),在范围内均匀生成对应的随机整数,不过他每次生成数据时要代一个引擎作为参数,也就是说,他是根据引擎生成的值再调整出来的,自己不具有生成随机数的功能,所以叫做“随机数分布对象”。再介绍些其他分布对象:
uniform_real_distribution<double> eng(min, max);// 浮点数均匀分布
normal_distribution<int> eng(average, SD); // 整数正态分布,需要方差和中间值
bernoulli_distribution eng(pro) //伯努利分布,生成true和false,可以指定true的概率
把真正生成随机数的东西和调整分布的东西分开是有好处的。因为随机数生成必须使用外部变量,占用额外空间。而调整阶段是不用的。因此,即使程序各个地方都在用随机数,也只需要一个default_random_engine。
C++库的随机数生成的更多相关文章
- 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算
http://www.cnblogs.com/batteryhp/p/5000104.html 第四章 Numpy基础:数组和矢量计算 第一部分:numpy的ndarray:一种多维数组对象 实话说, ...
- 【C/C++】随机数的生成
C/C++:rand()函数 rand()函数的头文件:#include<stdlib.h> 该函数产生的随机数随机性差,速度慢,周期小(0-32767) 用法如下所示: #include ...
- CUDA随机数生成库curand——deviceAPI
原创作品,如要转载请注明出处:http://www.cnblogs.com/shrimp-can/p/6590152.html 最近要在device函数中使用curand库生成随机数,查找了下资料,除 ...
- Java实验--课上提到的随机数生成原理简单实现(不利用库生成随机数的简单算法)
对于随机数的实验,根据课程上的教程,有如下的公式: 对应的变量参数的说明: 其中对应的Mouduls变量对应的就是公式中a的值,在公式中的含义就是相当于要循环多少个数才重复的一个值. Multipli ...
- Alg-4:算法可视化tiny库的实现
好吧,准备好好实践一下<算法>这本书的内容的,有点讨厌的是这本书是以Java作为示例语言的(好吧,我承认我有语言偏见,Java就是臭).其中有一个Std库,其中涉及到简化输入输出.随机数生 ...
- 【C】 06 - 标准库概述
任何程序都会有一些通用的功能需求,对这些需求的实现组成了库.它可以提高程序的复用性.健壮性和可移植性,这也是模块化设计的体现.C规范定义了一些通用接口库,这里只作概述性介绍,具体细节当然还是要查阅规范 ...
- Lo-Dash – 替代 Underscore 的优秀 JS 工具库
前端开发人员大都喜欢 Underscore,它的工具函数很实用,用法简单.这里给大家推荐另外一个功能更全面的 JavaScript 工具——Lo-Dash,帮助你更好的开发网站和 Web 应用程序. ...
- C/C++ 开源库及示例代码
C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1 ...
- (五)boost库之随机数random
(五)boost库之随机数random boost库为我们提供了许多的日常随机数生成器: 1.uniform_smallint:在小整数域内的均匀分布 2.uniform_int:在整数域上的均匀分布 ...
随机推荐
- 【HarmonyOS学习笔记】记第一次使用IDE
哈喽大家好我是脸皮贼厚的小威 愚人节刚过先给大家拜个早年吧 最近在HarmonyOS官网下载了IDE,并抱着学(wan)习(wan)的心态试着跑出了Hello World,并安装到手机上 这是一个简单 ...
- Java web与web gis学习笔记(一)——Tomcat环境搭建
系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...
- zookeeper篇-zk的选举机制
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 说说zk的选举机制 基础概念 zxid=事务id=一个时间戳,代表当前事 ...
- FreeRTOS --(1)链表
转载自 https://blog.csdn.net/zhoutaopower/article/details/106550648 Based On FreeRTOS Kernel V10.3.1 1. ...
- Python最强IDE(PyCharm)安装教程
欢迎关注公众号[Python开发实战],免费领取Python学习电子书! PyCharm是目前最流行.使用最广泛的Python IDE(Integrated Development Environme ...
- IT人的修炼之路
前言 计算机技术更新迭代的速度太快了,作为ITer每天除了面对工作,就要学习新技术,自己的感觉是一直在为技术疲于奔命,直到现在,也不敢放缓脚步.程序员每天必须抽出一定时间学习新技术,避免被淘汰. 1. ...
- 全网显示 IP 归属地,这背后的技术你知道吗?
为了进一步规范国内的网络舆论,国家规定了各互联网平台都需要显示 IP 归属地信息.微博.抖音.公众号等多个平台纷纷上线了 IP 归属地功能,这标志着国内言论的进一步规范化.但互联网平台商们是怎么通过 ...
- 公司为什么要使用OKR,目的是什么?
原创不易,求分享.求一键三连 站在公司角度,会有一些诉求: 想知道每个人在干什么,干得怎么样: 想知道如何把更多的人卷起来: 人是不想被管束的,无论是想"度量我"还是想卷我,都是我 ...
- Dnscat2隧道
0x01 前言 DNS是用来做域名解析的,是连接互联网的关键,故即使是企业内网,在防火墙高度关闭下,也有着很好的连通性,但是黑客却可以通过将其他协议的内容封装再DNS协议中,然后通过DNS请求和响 ...
- 树莓派开发笔记(十四):入手研华ADVANTECH工控树莓派UNO-220套件(三):使用研发自带系统测试rtc、gpio、232和485套件接口
前言 上一篇说明了必须要使用研华自带的8G卡的系统,通过沟通拿到了相关的系统,购买的时候会带8GB的卡,请自行备份一份镜像.本篇对uno-220套件的相关研华配套的额外接口做测试,篇幅较长,重点讲 ...