boost 随机数发生器
Random 随机数
在很多应用中都需要使用随机数。本库力求提供一个高效的,通用的随机数库。boost库有多种随机数生成方式。先熟悉一下各种随机数生成器的概念。
数字生成器(Number Generator)
它是一个函数对象,没有参数。类似于常见的rand( )。
均匀随机数生成器(Uniform Random Number Generator)
在一个范围内生成随机数,有强下界和强上界。一个例外是对于小数没有强上界,即v.min() <= x < v.max(),这主要是为了考虑形如[0,1)这类随机数。
不确定均匀随机数生成器(Non-deterministric Uniform Random Number Generator)
原话是:“一个不确定均匀随机数生成器是一个 UniformRandomNumberGenerator,它基于某种随机过程,因此能提供“真正随机的”的随机数序列。随机过程包括原子核衰变、Zehner 二极管的噪音、量子隧道效应、投掷骰子、罐中取物、投掷硬币等等。网络数据包到达的间隔、键盘事件有时也可以被看作随机过程。” 从这段话来看,这个模型是最先进的,不知道有没有实现。
伪随机数生成器(Pseudo-random Number Generator)
这是一种Uniform Random Number Generator,使用了某些线性算法。通常需要提供seed。
随机分布(Random Distrubution)
随机分布取均匀分布的随机值作为输入,输出符合某一分布的随机数。
头文件 <boost/random.hpp>
variate_generator 类模板
变种生成器用来组合随机数生成器和随机分布。关于生成器和分布,boost库提供了很多现成的。
概要:
template<class Engine, class Distribution>
class variate_generator
{
public:
typedef Engine engine_type;
typedef Distribution distribution_type;
typedef typename Distribution::result_type result_type;
variate_generator(Engine e, Distribution d);
result_type operator()();
template<class T>
result_type operator()(T value);
engine_value_type& engine();
const engine_value_type& engine() const;
result_type min() const;
result_type max() const;
};
比较迷惑人的是两个operator( )。
生成器
看到库后,发现有太多的生成器。每种生成器有不同的性质,内存要求,速度等。做为一个非专业人士,我不知道如何选择。库的说明文档中指出,如果不清楚如何选择,就使用mt19937,好吧,我就用mt19937了。
这里所有的生成器都是,typedef 进行专门化来给出的,封装在 boost::random 名字空间中。例如:
typedef random::mersenne_twister< > mt19937;
用法:
boost::variate_generator<boost::mt19937, boost::uniform_real<> > vgen (boost::mt19937(),boost::uniform_real<>(0, 1)); //生成 [0, 1)的随机数
for(int i = 0; i < 10; i++) cout<< vgen( );
分布
讲到分布,这个数学知识就更深了。我从手册上copy一份表格吧.
分布 |
描述 |
实例 |
uniform_smallint |
在小整数集 (远小于内部生成器的值域) 上的离散均匀分布 |
罐中取物 |
uniform_int |
在整数集上的离散均匀分布;可能会多次调用内部生成器以获得足够多的“随机性” |
罐中取物 |
uniform_01 |
区间 [0,1) 上的连续均匀分布;此分布是其它分布的重要基础 |
- |
uniform_real |
实数区间 [min, max) 上的连续均匀分布 |
随机投下一木棍,其偏转角的弧度数是 [0, 2pi) 上的这种分布 (假设偏转角的分布是均匀的) |
bernoulli_distribution |
伯努利试验 (Bernoulli experiment):布尔离散分布,概率可配置 |
投掷硬币 (p=0.5) |
geometric_distribution |
几何分布:重复伯努利试验,直到出现某一结果的试验次数 |
抛掷骰子,记录“6”首次出现时的试验次数 |
triangle_distribution |
? |
? |
exponential_distribution |
指数分布 |
放射性物质发射 alpha 粒子的间隔时间 |
normal_distribution |
无穷次重复伯努利试验的结果计数 |
投掷硬币 10000 次,记录正面出现的次数 |
lognormal_distribution |
对数正态分布 (lognormal distribution) (有时用于模拟) |
流水线工人的工作完成时间 |
uniform_on_sphere |
任意给定维数空间的单位球面上的均匀分布 |
在地球 (近似看作是球体) 表面任选一点去旅游 |
- void test_mt19937()
- {
- // 以时间为种子创建一个随机数发生器
- boost::mt19937 rng(time(0));
- for (int i = 0; i < 100; ++i)
- {
- std::cout << rng() << std::endl;
- }
- }
- void test_rand48()
- {
- boost::rand48 rng;
- for (int i = 0; i < 10; ++i)
- {
- std::cout << rng() * 1.0 / std::numeric_limits<boost::rand48::result_type>::max() << std::endl;
- }
- }
- // uniform_smallint:在小整数域内的均匀分布
- // uniform_int:在整数域上的均匀分布
- // uniform_01:在区间[0,1]上的实数连续均匀分布
- // uniform_real:在区间[min,max]上的实数连续均匀分布
- // bernoulli_distribution:伯努利分布
- // binomial_distribution:二项分布
- // cauchy_distribution:柯西(洛伦兹)分布
- // gamma_distribution:伽马分布
- // poisson_distribution:泊松分布
- // geometric_distribution:几何分布
- // triangle_distribution:三角分布
- // exponential_distribution:指数分布
- // normal_distribution:正态分布
- // lognormal_distribution:对数正态分布
- // uniform_on_sphere:球面均匀分布
- void test_random_distribute()
- {
- boost::mt19937 rng(time(0));
- // 1. uniform_int
- boost::uniform_int<> ui(0, 255);
- for (int i = 0; i < 10; ++i)
- {
- std::cout<< ui(rng) << std::endl;
- }
- // 2. uniform_01
- boost::uniform_01<boost::mt19937&> u01(rng);
- for (int i = 0; i < 10; ++i)
- {
- std::cout<< u01() << std::endl;
- }
- }
转载于:https://www.cnblogs.com/liaocheng/p/4233816.html
boost 随机数发生器相关推荐
- 量子计算机真随机数,量子真随机数发生器研究取得进展
量子真随机数发生器研究取得进展 超高速真随机数发生器简化设计方案(上)与后处理方法(下) 信息科学技术学院郭弘教授课题组与物理学院张建玮副教授课题组开展合作,在用光学随机源设计研制量子真随机数发生器的 ...
- OpenCV 【十六】RNG随机数发生器putText绘制文字
1 目的 使用 随机数发生器类 (RNG) 并得到均匀分布的随机数. 通过使用函数 putText 显示文字. 第一步是实例化一个 Random Number Generator(随机数发生器对象) ...
- c51汇编语言随机数函数,汇编语言随机数发生器
我最近开始学习汇编语言.对于我正在研究的项目,我必须使用线性一致性来生成随机数生成器.我想拿三个数字.上限,下限和我想要的随机数的数量.如式为获得一个随机数,我想出了....汇编语言随机数发生器 ra ...
- OpenCV之core 模块. 核心功能(2)基本绘图 随机数发生器绘制文字 离散傅立叶变换 输入输出XML和YAML文件 与 OpenCV 1 同时使用
基本绘图 目的 本节你将学到: 如何用 Point 在图像中定义 2D 点 如何以及为何使用 Scalar 用OpenCV的函数 line 绘 直线 用OpenCV的函数 ellipse 绘 椭圆 用 ...
- 【STM32】随机数发生器相关函数和类型
00. 目录 文章目录 00. 目录 01. RNG概述 02. 相关类型 03. 相关函数 04. 结构体封装 05. 预留 06. 附录 07. 声明 01. RNG概述 RNG 处理器是一个以连 ...
- 【STM32】随机数发生器详解
00. 目录 文章目录 00. 目录 01. 随机数发生器简介 02. 随机数发生器主要特性 03. 随机数发生器功能说明 04. 随机数发生器操作 05. 随机数发生器寄存器 5.1 RNG 控制寄 ...
- 随机数发生器怎么用_用随机数发生器射击自己的脚
随机数发生器怎么用 这将不是解释随机数生成器毕竟不是那么随机的文章之一. 因此,您中的那些人希望获得有关如何破解老虎机,继续前进的指南,在这里什么也看不到. 相反,它是有关一个不太常见的锁争用问题的帖 ...
- 基础学习笔记之opencv(14):随机数发生器绘制文字
本文主要介绍下opencv中自带的一个随机数发生器的类RNG,这里我用这个类来画一些图形,和基础学习笔记之opencv(13):基本绘图 一文中类似,只是 这里画出来图像的坐标,大小,颜色,角度等所有 ...
- 一个随机数发生器(一)
老黄.老银和老阳共事宇宙中心某互联网企业H,并且同在一个由校招新生组成的Team里.刚走出校园的他们,对自己去年在校招这场演技大比拼中的表现意犹未尽,因此常会拿一些没什么实际意义的技术问题大谈特谈. ...
最新文章
- commons-pool2-2.3 jar包_Java Jar包压缩、解压使用指南
- 计算机基础知识关于进制,计算机基础知识-- 进制和编码
- android 修改framework下资源文件后如何编译
- [专栏目录]-Crypto学习笔记目录
- thymeleaf的常见用法
- Pandas to_string
- Parasoft软件测试实践:什么是左移测试?
- matlab breline,linebreak_header must be terminated by a line break怎么解决
- vue+element+node构建单片机控制系统
- 使用SPSS 进行两组独立样本的t检验、F检验、显著性差异、计算p值
- Unity Error 打AssetBundle时出现 An asset is marked with HideFlags.DontSave but is included in the build
- netstat -ano命令查询端口
- StringBuffer字符串
- Windows python3安装word2vec模块常见错误处理
- 湖南卫视全部节目主持人名单
- EXCEL双击文件打开是空白的
- 展讯系统 Dialer 强力定制
- thinkcmf需要的php版本,升级指导 · ThinkCMF5开发手册 · 看云
- 抽象数据类型Polynomial 的实现(第二章 P40-43 算法2.22,2.23)
- 人人都是网站分析师:从分析师的视角理解网站和解读数据
热门文章
- 百度、阿里、腾讯、有道各平台翻译API申请教程
- echarts结合poi-word导出的简单处理
- android 蓝牙触控笔,自带磁场的神奇触控笔无需蓝牙无需充电
- 概论_第3章_已知联合密度求边缘密度
- INT 21H 指令说明及使用方法(汇编语言学习)
- 电大计算机网络形成性考核册,2017电大《计算机应用基础(Win7)》形成性考核册(参考答案)...
- 利用Javascript输出多个图片
- Linux安装防火墙
- Coursera SQL for Data Science - Notes
- 超越CLIP!谷歌发布首个大规模MoE架构的视觉语言模型