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语言的起源 ...
随机推荐
- PHP多维数组转一维
目录 1. array_column函数 2. array_walk函数 3. array_map函数 4. foreach循环 5. array_map变种 参考:https://www.awaim ...
- cocos2d-x JS 定时器暂停方法
this.scheduleOnce(function(){ this.addChild(Menugobtn);//要暂停执行的代码 }, 10);
- 56.关于vue项目的seo问题
不可否定的是,vue现在火.但是在实际项目中,特别是像一下交互网站,我们不可避免会考虑到的是seo问题,这直接关系到我们网站的排名,很多人说用vue搭建的网站不能做优化,那我们真的要放弃vue,放弃前 ...
- SiteCore Experience Analytics-路径分析地图
路径分析地图 路径分析器是一个应用程序,允许您查看联系人在浏览网站时所采用的各种路径.您可以查看联系人在转换目标并与广告系列互动时所采用的路径,让您深入了解哪些路径为每次转化提供最佳参与价值,以及哪些 ...
- python 减少可调用对象的参数个数
有一个被其他python 代码使用的callable 对象,可能是一个回调函数或者是一个处理器,但是它的参数太多了,导致调用时出错 如果需要减少某个函数的参数个数, 你可以使用functools.pa ...
- 解决mysql中文乱码问题?
mysql是我们项目中非常常用的数据型数据库.但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况.下面就来介绍一下如何彻底解决数据库中文乱码情况. 1.中文乱码 1.1.中文乱码 cre ...
- 创建servlet程序知识点详解---servlet-day03
#1.表单包含有中文参数值,如何处理? ##(1)为什么会有乱码? 表单提交时,浏览器会对中文参数值进行编码/ 注:会按照表单所有的页面打开时所使用的字符集进行编码 比如,浏览器会使用utf-8对中文 ...
- python_study-1
# Author:larlly'''函数1.在Python交互式命令行下,可以直接输入代码,然后执行,并立刻得到结果.2.文本编辑器推荐俩款 http://www.sublimetext.com/ h ...
- Porsche Piwis Tester II V12.100 Version Released
Piwis Tester II v12.100 Version released today! In this new version we can find the latest type Pors ...
- Linux 安装vsftpd和ftp客户端
1.下载安装包:ftp-0.17-54.el6.x86_64.zip和vsftpd-2.2.2-11.el6_4.1.x86_64.zip 可以直接在Linux底下用yum install vsftp ...