boost高质量随机数库 zhuan
shared_ptr<int> tmp2(new int(10)) ;
int * test=tmp2.get();
std::cout<<*test<<" "<<*tmp2<<" "<< * ( (int*)( tmp2.get() ) );
10 10 1011
not 10 10 10
why?
一. 概念
随机数被用在很多场合, 比如数值计算, 游戏, 加密, 测试.
根据场合的不同, 需求的随机数发生器也不尽相同. 可以分为一下三种.
non-deterministic random number generator
pseudo-random number generator
quasi-random number generator
[数字发生器{number generator)]
一个数字发生器是一个函数对象, 对他直接调用operator()就可以.
[随机数发生器(uniform random number generator)]
基于数字发生器, 但是产生的是随机数. 可以通过has_fixed_range指定随机数
是否该有产生范围, 可以通过min_value和max_value来指定随机数产生的范围界
限.
[非确定性随机数发生器(Non-deterministic Uniform Random Number Generator)]
这是真正的"随机数"发生器. 基本上没有可能在标准C++范围之内完成, 所以使
用的random_device类的构造函数需要传入一个字符串来指明随机数发生设备的
位置. 在很多unix下面,就是/dev/urandom.
[伪随机数发生器(Pseudo-Random Number Generator)]
基于随机数发生器. 通过特定的算法和内部状况, 产生确定性的伪随机数序列. 可以通过seed来设定种子.
[Quasi-Random Number Generators(不知道怎么称呼)]
实际上就是对于已知的随机数种子根据特定算法算出来的确定数组, 这在很多场
合就足够的了.
二. 使用
random的文件组织相对复杂, 一般情况下, 直接包含random.hpp是最简单直接的办法.
要声明一个generator来产生随机数, 比如boost::hellekalek1995 generator(13);
boost::hellekalek1995是一个随机数产生器, 13是个随机数种子.
然后声明一个随机数分布(uniform random number distribution)来产生随机数.
比如
boost::uniform_smallint<boost::hellekalek1995> die_gen(generator,1, 6)
然后就可以不停的读取die_gen, 比如
std::cout << dir_gen() << std::endl;
一个最简单的例子比如:
#include <iostream>
#include <boost/random.hpp>
int main()
{
boost::hellekalek1995 generator(17);
boost::uniform_smallint<boost::hellekalek1995> die_gen(generator, 1, 6);
for( int i = 1; i <= 10; i++ )
{
std::cout << die_gen() << std::endl;
}
return 0;
}
|
|
usidc5 | 2011-07-18 12:16 |
简介 概览 uniform_smallint 类模板 uniform_int 类模板 uniform_01 类模板 uniform_real 类模板 bernoulli_distribution 类模板 geometric_distribution 类模板 triangle_distribution 类模板 exponential_distribution 类模板 normal_distribution 类模板 lognormal_distribution 类模板 uniform_on_sphere 类模板 简介 除了 随机数生成器 之外,本库还提供了把一种分布 (通常是生成器产生的均匀分布) 映射到另一种分布的分布函数。(译注:在本节中,“分布”指统计学意义上的分布,而“分布函数”指的是类模板。内部的随机数生成器有时会更一般地被称为“随机数源”。) 对于某一映射通常会有多种实现方案:有的需要较多的空间和对内部随机数源的调用,而有的需要进行较多的费时的运算 (如三角函数)。以下给出的对接口的描述是与具体实现无关的;然而,如果某一实现不能覆盖特定分布的全部值域,或者不符合该分布的统计学性质,该实现是无效的。 分布 描述 实例 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 任意给定维数空间的单位球面上的均匀分布 在地球 (近似看作是球体) 表面任选一点去旅游 分布函数的模板参数总按照下列顺序排列: 内部随机数源 返回类型,其默认值为一合适的类型 (可能无这一参数) 分布函数不再满足输入迭代器 (input iterator) 的需求 (std:24.1.1 [lib.input.iterators]),因为这对于生成器(Generator)接口来说是多余的,还会对所有用户带来运行时的开销。而且,一个诉诸于随机数生成的生成器接口更为"自然"。如果你需要把生成器包装进一个输入迭代器接口,可以使用 迭代器适配器(iterator adaptor)。 下面描述的所有分布函数都保存对随机数源的一个非 const 引用;因此分布函数不是 Assignable;不过它们是 CopyConstructible。复制分布函数将会复制参数值;副本和原分布函数将会使用同一内部随机数源,因此两者会从同一序列中取得随机数。 对于在 概念文档 中已经给出定义的成员,在下面的描述中不会详细说明。 <boost/random.hpp> 中的分布:概览 namespace boost { template<class IntType = int> class uniform_smallint; template<class IntType = int> class uniform_int; template<class RealType = double> class uniform_01; template<class RealType = double> class uniform_real; // discrete distributions // continuous distributions template<class IntType = int> template<class IntType = int> template<class UniformRandomNumberGenerator, class RealType = double> template<class RealType = double> template<class RealType = double> explicit bernoulli_distribution(const RealType& p = RealType(0.5)); template<class UniformRandomNumberGenerator, class IntType = int> explicit geometric_distribution(const RealType& p = RealType(0.5)); template<class RealType = double> template<class RealType = double> template<class RealType = double> template<class RealType = double> template<class RealType = double, 代码实例: #include "boost/scoped_ptr.hpp" uniform_int<> distribution(1, 100) ; |
boost高质量随机数库 zhuan的更多相关文章
- R语言的高质量图形渲染库Cairo(转)
前言 R语言不仅在统计分析,数据挖掘领域,计算能力强大.在数据可视化上,也不逊于昂贵的商业.当然,背后离不开各种开源软件包的支持,Cairo就是这样一个用于矢量图形处理的类库. Cairo可以创建高质 ...
- mt19937 -- 高质量随机数
优点:产生速度快, 周期大 用法: #include<bits/stdc++.h> using namespace std; int main() { mt19937 mt_rand(ti ...
- Wuss Weapp 一款高质量,组件齐全,高自定义的微信小程序 UI 组件库
Wuss Weapp 一款高质量,组件齐全,高自定义的微信小程序 UI 组件库 文档 https://phonycode.github.io/wuss-weapp 扫码体验 使用微信扫一扫体验小程序组 ...
- 编写高质量Python程序(四)库
本系列文章为<编写高质量代码--改善Python程序的91个建议>的精华汇总. 按需选择 sort() 或者 sorted() Python 中常用的排序函数有 sort() 和 sort ...
- 高质量C++/C编程指南(林锐)
推荐-高质量C++/C编程指南(林锐) 版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐 2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐 20 ...
- HTML Inspector – 帮助你编写高质量的 HTML 代码
HTML Inspector 是一款代码质量检测工具,帮助你编写更优秀的 HTML 代码.HTML Inspector 使用 JavaScript 编写,运行在浏览器中,是最好的 HTML 代码检测工 ...
- 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点
深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 2011-12-28 23:00 by 汤姆大叔, 139489 阅读, 119 评论, 收藏, 编辑 才华横溢的 ...
- 高质量C++[转]
高质量C++/C编程指南 文件状态 [ ] 草稿文件 [√] 正式文件 [ ] 更改正式文件 文件标识: 当前版本: 1.0 作 者: 林锐 博士 完成日期: 2001年7月24日 版 本 ...
- iOS书摘之编写高质量iOS与OS X代码的52个有效方法
来自<Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法>一书的摘要总结 一.熟悉Objective-C 了解Objective-C语言的起源 ...
随机推荐
- expect-调试模式的使用
1.expect简介 Expect是一种TCL扩展性的语言,主要用于完成系统交互方面的功能,比如SSH.FTP等,这些程序都需要手工与它们进行互动,而使用Expect就可以模拟人手工互动的过程,是一种 ...
- [svc]共享内存
ipc是什么? 进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法. 进程间为何不能直接共享数据? 如何解决ipc问题? ...
- java之连接数据库之JDBC访问数据库的基本操作
1.将数据库的JDBC驱动加载到classpath中,在基于JavaEE的web应用实际开发过程中通常要把目标数据库产品的JDBC驱动复制到WEB—INF/lib下. 2.加载JDBC驱动并将其注册到 ...
- CentOS 7 之 Systemd 入门教程:实战篇
开机启动对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件. 如果你想让该软件开机启动,就执行下面的命令(以httpd.ser ...
- Bubble Sort (找规律)
通过模拟之后我们发现对于每一个位置上的数他都有一个规律,那就是先左移然后在右移.然后仔细发现可以知道,先右移的距离是前面比该数大的个数.右移就直接右移到目标位置了.然后用一个树状数组从左到右边扫边加就 ...
- 线上bug分析
昨天下午大神把组内几十号人召集在一起开Online bug分析大会,主要是针对近期线上事故从事故原因和解决方案两个维度来分析. 对金融软件来说,每一次的线上事故都有可能给公司带来重大的损失,少扣了用户 ...
- Class_fifth
1,统计文件夹的文件总数 代码: package Class_fifth; import java.io.File; public class Statistics { public static v ...
- 进程间通信之信号量、消息队列、共享内存(system v的shm和mmap)+信号signal
进程间通信方式有:System v unix提供3种进程间通信IPC:信号量.消息队列.共享内存.此外,传统方法:信号.管道.socket套接字. [注意上述6种方式只能用户层进程间通信.内核内部有类 ...
- vue-i18n安装配置,运行
需求:根据浏览器语言自动切换语言 1.安装vue-i18n, yarn安装 $ yarn add vue-i18n npm安装 $ npm install vue-i18n 2.导入语言包 src下创 ...
- Linux 系统最大TCP连接数 调优
Linux系统TCP最大连接数 Linux系统可接连接到最大的TCP连接数,高并发情况下可进行扩展加大,最大为65536. 限制最大TCP连接数 修改文件:/etc/sysctl.conf 生效命令: ...