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;
- }
- }
boost 随机数发生器的更多相关文章
- 浅谈C#随机数发生器
我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.net Framework中提供了一个专门用来产生随机数的类System.Random. 对于随机数,大家都知道,计算机不 可 ...
- [nRF51822] 16、nRF51822的随机数生成器,及随机数生成器的一些知识(可以帮您补补随机数发生器的知识)
1.前言 随机数生成器在通信.加密.图像传输等领域应用广泛,且一般起到关键性作用.我在最近设计的一个近场射频通信协议的碰撞避退算法的过程中,便对此有深深体会. 2.伪随机数发生器 随机数发生器一般包括 ...
- 玩转X-CTR100 l STM32F4 l RNG硬件随机数发生器
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器 STM32F4硬件随 ...
- QuantLib 金融计算——数学工具之随机数发生器
目录 QuantLib 金融计算--数学工具之随机数发生器 概述 伪随机数 正态分布(伪)随机数 拟随机数 HaltonRsg SobolRsg 两类随机数的收敛性比较 如果未做特别说明,文中的程序都 ...
- C++11随机数发生器
前言 一直知道所谓的"随机数"都是伪随机,事实上也是满足某种规则生成的.有些程序测试时通常需要一个随机数源,但在新标准出现之前,C++都是依赖简单的C库函数rand来生成随机数的. ...
- CPP-STL:随机数发生器random_shuffle
//--------------------------------------------------------------------------- #include <string.h& ...
- 文献翻译|Design of True Random Number Generator Based on Multi-stage Feedback Ring Oscillator(基于多级反馈环形振荡器的真随机数发生器设计)
基于多级反馈环形振荡器的真随机数发生器设计 摘要 真随机数生成器(trng)在加密系统中起着重要的作用.本文提出了一种在现场可编程门阵列(FPGA)上生成真随机数的新方法,该方法以 多级反馈环形振荡器 ...
- C语言基础(11)-随机数发生器
一. rand() rand是一个C语言库函数,功能是生成一个随机数.rand需要一个不同的种子,才能生成不同的随机数. 二. srand(int seed) rand需要一个不同的种子,才能生成不同 ...
- delphi真随机数发生器
当然不是绝对真随机,是相对真随机数 下载
随机推荐
- xml实体注入学习
好久没学习技术了 很多东西都忘了 复习一下 测试代码 <?php $xml = file_get_contents("php://input"); $data = sim ...
- ACM-ICPC 2018 焦作赛区网络预赛 K Transport Ship (多重背包)
https://nanti.jisuanke.com/t/31720 题意 t组样例,n种船只,q个询问,接下来n行给你每种船只的信息:v[i]表示这个船只的载重,c[i]表示这种船只有2^(c[i] ...
- 在 CentOS6 上安装 Zabbix2.4 Server
#!/bin/bash # # .配置无人值守的安装,定义安装过程中需要用到的一些信息 # mysql_root_pw=root_pw mysql_zabbix_pw=zabbix_pw DBPass ...
- electron入门
Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Electron通过将Chromium和Node.js合并到同一个运行时环境中,并 ...
- 使用js弹出div刷新时闪烁解决方法
<div style="visibility: hidden"> //弹出div内容 </div>
- 【Ubuntu】安装Java和Eclipse
1. 安装Java 1> sudo add-apt-repository ppa:webupd8team/java 2> sudo apt-get update 3> sudo ap ...
- 关于mirai的一些研究
关于mirai的一些研究 0x01.源码编译: 配置好对应的go开发环境,即可进行编译,生成了主要的文件 badbot为僵尸节点的可执行文件,cnc为主控端的可执行文件,其它一些为辅助工具. 如下图所 ...
- 迅为-IMX6UL开发板丨双网口丨双CAN总线丨4路USB HOST丨2路串口、6路插座引出,共8路串口丨1路RGB信号丨2路LVDS信号
迅为iMX6UL开发板多路串口开发平台迅为i.MX 6UL开发板基于ARM Cortex-A7内核,主频高达528 MHz,内存:512MDDR3存储:8G EMMC,支持2路CAN,2路百兆以太网, ...
- luogu P4385 [COCI2009]Dvapravca
传送门 我真的弱,正解都不会还打了个错的暴力 考虑平行线与x轴平行,那么可以按照y为第一关键字升序,x为第二关键字升序排序,然后合法的一段红点就是连续的一段,答案也就是最大的连续红色段 推广到一般情况 ...
- python练习题1
1.使用while循环打印输入 1 2 3 4 5 6 8 9 10 num = 1 while num <= 10: if num == 7: num = num + 1 continue e ...