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语言的起源 ...
随机推荐
- oracle 日期取 月 日
今天碰到只要取月份和天数,如果月份前面有0要去掉0.比如说2010-01-08 ,需要的结果是1-8. 引出了一系列的sql语句 第一: 利用to_number的函数转换自动截0 select to_ ...
- C++编译器将自动为类产生四个缺省的函数
构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹大意, 其实这些貌似简单的函数就象没有顶盖的下水道那样危险. 每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包 ...
- day014 模块
# 1.用于多种语言交互 编程语言通用数据 # 内置的 不需要安装 直接导入使用 import json # 导入一个json模块 # dumps loads# dump load 有持久化的功能 # ...
- 【LeetCode每天一题】Merge Intervals(合并区间)
Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2,6],[8, ...
- python迭代-可迭代对象与迭代器对象
可迭代对象与迭代器对象 问题举例 某软件要求,从网络抓取各个城市的气温信息,并依次显示: 北京:15~22 上海:18~23 ...... 如果一次抓取所有城市气温信息再显示,显示第一个城市的气温时会 ...
- mysql 日期相关 CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME
MySQL 时间函数 SELECT CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME, CURRENT_TIME(), NOW(); https://dev. ...
- CentOS 7 nginx+tomcat9 session处理方案之session保持
Session保持(会话保持)是我们见到最多的名词之一,通过会话保持,负载均衡进行请求分发的时候保证每个客户端固定的访问到后端的同一台应用服务器.会话保持方案在所有的负载均衡都有对应的实现.而且这是在 ...
- ASP.NET页面之间传值的方式之QueryString(个人整理)
QueryString Querystring也叫查询字符串,这种页面间传递数据是利用网页地址URL.如果要从A页面跳转到B页面,则可以用Request.Redirect(”B.aspx?参数名=参数 ...
- 内存地址 id
def a(): return b def b(): print('666')c = a()print(c) #打印16进制的内存地址print(b) #打印16进制的内存地址print (id(c) ...
- [转载]Oracle创建用户、角色、授权、建表
出处:https://www.cnblogs.com/roger112/p/7685307.html oracle数据库的权限系统分为系统权限与对象权限.系统权限( database system p ...