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
template<class RealType = double>
class bernoulli_distribution;
template<class IntType = int>
class geometric_distribution;
// continuous distributions
template<class RealType = double>
class triangle_distribution;
template<class RealType = double>
class exponential_distribution;
template<class RealType = double>
class normal_distribution;
template<class RealType = double>
class lognormal_distribution;
template<class RealType = double,
class Cont = std::vector<RealType> >
class uniform_on_sphere;
}
uniform_smallint
类模板#include <boost/random/uniform_smallint.hpp>
template<class IntType = int>
class uniform_smallint
{
public:
typedef IntType input_type;
typedef IntType result_type;
static const bool has_fixed_range = false;
uniform_smallint(IntType min, IntType max);
result_type min() const;
result_type max() const;
void reset();
template<class UniformRandomNumberGenerator>
result_type operator()(UniformRandomNumberGenerator& urng);
};
分布函数 uniform_smallint
是 随机分布 的模型。每次调用都将返回在整数集 {min, min+1, min+2, ..., max} 上均匀分布的随机整数。它假设目的区间长度 (max-min+1) 比内部随机数源小得多,因此不考虑量子化 (quantization) 问题。
令 rout=(max-min+1) 为目的区间 (或其长度),rbase 为随机数源的区间 (或其长度)。今要求产生一均匀分布,即 rout 中任意数 i 的理论概率为 pout(i) = 1/rout。类似地,内部随机数源产生 rbase 上的均匀分布,故有 pbase(i) = 1/rbase。令概率函数 pout_s(i) 描述 uniform_smallint
实际产生的分布函数。对 rout 中的各 i ,(pout_s(i)/pout(i) -1)2 的和应不大于 rout/rbase2 (rbase mod rout)(rout - rbase mod rout)。
模板参数 IntType
应为一类整数的值类型。
注记:上述和式是要求的分布函数 pout(i) 和实际产生的分布函数 pout_s(i) 中各数概率相对差的平方和。其值可由计算 (base_rng mod rout) 来得到,如下:令 r = rbase mod rout。rbase 上的基础分布被折叠到区间 rout 上。数字 i < r 快已被赋以基础分布的 (rbase div rout)+1 个数字,只剩下 (rbase div rout)。因此,对于 i < r,pout_s(i) = ((rbase div rout)+1) / rbase,而对于其它 i,pout_s(i) = (rbase div rout)/rbase。在以上求和公式中替换这一部分,可得到希望的结果。
注记:(rbase mod rout)(rout - rbase mod rout) 的上限是 rout2/4。对于 rout3/(4*rbase2) 的相对量化误差的平方和的上限, 明智的方法是,要么选择一个满足 rbase > 10*rout2 的 rbase,要么确保 rbase 可被 rout 整除。
uniform_smallint(IntType min, IntType max)
效果:构造一 uniform_smallint
函子。min
和 max
分别为输出值域的上下界。
uniform_int
类模板#include <boost/random/uniform_int.hpp>
template<class IntType = int>
class uniform_int
{
public:
typedef IntType input_type;
typedef IntType result_type;
static const bool has_fixed_range = false;
explicit uniform_int(IntType min = 0, IntType max = 9);
result_type min() const;
result_type max() const;
void reset();
template<class UniformRandomNumberGenerator>
result_type operator()(UniformRandomNumberGenerator& urng);
template<class UniformRandomNumberGenerator>
result_type operator()(UniformRandomNumberGenerator& urng, result_type n);
};
分布函数 uniform_int
是 随机分布 的模型。每次调用都将返回在整数集 {min, min+1, min+2, ..., max} 上均匀分布的随机整数。
模板参数 IntType
应为一类整数的值类型。
uniform_int(IntType min = 0, IntType max = 9)
需求: min <= max
效果:构造一 uniform_int
对象。min
和 max
为分布的参数。
result_type min() const
返回:分布的 "min" 参数。
result_type max() const
返回:分布的 "max" 参数。
result_type operator()(UniformRandomNumberGenerator& urng, result_type n)
返回:在值域 0 <= x < n 内均匀分布的随机数 x。[注记:可以将一个带有 uniform_int
分布的 variate_generator
对象用于 std::random_shuffe,请见 [lib.alg.random.shuffle]. ]
uniform_01
类模板#include <boost/random/uniform_01.hpp>
template<class UniformRandomNumberGenerator, class RealType = double>
class uniform_01
{
public:
typedef UniformRandomNumberGenerator base_type;
typedef RealType result_type;
static const bool has_fixed_range = false;
explicit uniform_01(base_type rng);
result_type operator()();
result_type min() const;
result_type max() const;
};
分布函数 uniform_01
是 随机分布 的模型。每次调用都将返回在区间 [0...1) 上均匀分布的随机浮点数。这一数值是用 std::numeric_limits<RealType>::digits
个随机二进制位构造而成的,也即浮点数的尾数全都是随机的二进制位。[注记:是否要使这一行为可配置?]
警告:因为偶然的历史原因,此类的构造函数取一 UniformRandomNumberGenerator,且 传值。通常需要的是引用语义,从而生成器可以被“就地”地修改;如果需要引用语义,用引用类型作为 UniformRandomNumberGenerator 的模板参数。
模板参数 RealType
应为一类浮点的值类型,支持双目运算符 +, - 和 /。rng.max()-rng.min()+1
的值必须在其可表示范围内。
base_type::result_type
必须为一类数字的值类型,必须支持到 RealType
的 static_cast<>
和双目运算符 -。
注意:当前的实现是有 bug 的,因为在某些情况下不会把尾数全部填充为随机的二进制位。目前尚不知道如何把 (未实现的) boost::bigfloat
类有效地用随机位填满。可能需要一个 traits 类。
explicit uniform_01(base_type rng)
效果:构造一 uniform_01
函子,使用给定的随机数生成器作为内部随机数源。
uniform_real
类模板#include <boost/random/uniform_real.hpp>
template<class RealType = double>
class uniform_real
{
public:
typedef RealType input_type;
typedef RealType result_type;
static const bool has_fixed_range = false;
uniform_real(RealType min = RealType(0), RealType max = RealType(1));
result_type min() const;
result_type max() const;
void reset();
template<class UniformRandomNumberGenerator>
result_type operator()(UniformRandomNumberGenerator& urng);
};
分布函数 uniform_real
是 随机分布 的模型。每次调用都将返回在区间 [min..max) 上均匀分布的随机浮点数。这一数值是用 std::numeric_limits<RealType>::digits
个随机二进制位构造而成的,也即浮点数的尾数全都是随机的二进制位。
注意:当前的实现是有 bug 的,因为在某些情况下不会把尾数全部填充为随机的二进制位。
uniform_real(RealType min = RealType(0), RealType max = RealType(1))
需求: min <= max
效果:构造一 uniform_real
对象。min
和 max
是分布的参数。
result_type min() const
返回:分布的 "min" 参数。
result_type max() const
返回:分布的 "max" 参数。
bernoulli_distribution
类模板#include <boost/random/bernoulli_distribution.hpp>
template<class RealType = double>
class bernoulli_distribution
{
public:
typedef int input_type;
typedef bool result_type;
explicit bernoulli_distribution(const RealType& p = RealType(0.5));
RealType p() const;
void reset();
template<class UniformRandomNumberGenerator>
result_type operator()(UniformRandomNumberGenerator& urng);
};
bernoulli_distribution
类模板的实例是 随机分布 的模型。此分布产生 bool
值,概率满足 P(true) = p 且 P(false) = 1-p。p 是分布的参数。
bernoulli_distribution(const RealType& p = RealType(0.5))
需求: 0 <= p <= 1
效果:构造一 bernoulli_distribution
对象。p
是分布的参数。
RealType p() const
返回:分布的 "p" 参数。
geometric_distribution
类模板#include <boost/random/geometric_distribution.hpp>
template<class UniformRandomNumberGenerator, class IntType = int>
class geometric_distribution
{
public:
typedef RealType input_type;
typedef IntType result_type;
explicit geometric_distribution(const RealType& p = RealType(0.5));
RealType p() const;
void reset();
template<class UniformRandomNumberGenerator>
result_type operator()(UniformRandomNumberGenerator& urng);
};
geometric_distribution
类模板的实例是 随机分布 的模型。对整数 i >= 1,产生 i 的概率 p(i) = (1-p) * pi-1,其中 p 是分布的参数。对 UniformRandomNumberGenerator 的每次调用应产生在 [0,1) 上均匀分布的浮点数。
geometric_distribution(const RealType& p = RealType(0.5))
需求: 0 < p < 1
效果:构造一 geometric_distribution
对象。p
是分布的参数。
RealType p() const
返回:分布的 "p" 参数。
triangle_distribution
类模板#include <boost/random/triangle_distribution.hpp>
template<class RealType = double>
class triangle_distribution
{
public:
typedef RealType input_type;
typedef RealType result_type;
triangle_distribution(result_type a, result_type b, result_type c);
result_type a() const;
result_type b() const;
result_type c() const;
void reset();
template<class UniformRandomNumberGenerator>
result_type operator()(UniformRandomNumberGenerator& urng);
};
triangle_distribution
类模板的实例是 随机分布 的模型。返回的浮点数 x
满足 a <= x <= c
; x
服从三角形分布 (triangle distribution),其中 b
为密度最大的点。对 UniformRandomNumberGenerator 的每次调用应产生在 [0,1) 上均匀分布的浮点数。
triangle_distribution(result_type a, result_type b, result_type c)
效果:构造一 triangle_distribution
函子。a, b, c
是分布的参数。
exponential_distribution
类模板#include <boost/random/exponential_distribution.hpp>
template<class RealType = double>
class exponential_distribution
{
public:
typedef RealType input_type;
typedef RealType result_type;
explicit exponential_distribution(const result_type& lambda);
RealType lambda() const;
void reset();
template<class UniformRandomNumberGenerator>
result_type operator()(UniformRandomNumberGenerator& urng);
};
exponential_distribution
类模板的实例是 随机分布 的模型。对实数 x > 0,其密度 p(x) = lambda * exp(-lambda * x),其中 lambda 是分布的参数。对 UniformRandomNumberGenerator 的每次调用应产生在 [0,1) 上均匀分布的浮点数。
exponential_distribution(const result_type& lambda = result_type(1))
需求: lambda > 0
效果:构造一 exponential_distribution
对象。lambda
是分布的参数。
RealType lambda() const
返回:分布的 "lambda" 参数。
normal_distribution
类模板#include <boost/random/normal_distribution.hpp>
template<class RealType = double>
class normal_distribution
{
public:
typedef RealType input_type;
typedef RealType result_type;
explicit normal_distribution(const result_type& mean = 0,
const result_type& sigma = 1);
RealType mean() const;
RealType sigma() const;
void reset();
template<class UniformRandomNumberGenerator>
result_type operator()(UniformRandomNumberGenerator& urng);
};
normal_distribution
类模板的实例是 随机分布 的模型。对任意实数 x,其密度 p(x) = 1/sqrt(2*pi*sigma) * exp(- (x-mean)2 / (2*sigma2) ),其中 mean 和 sigma 是分布的参数。对 UniformRandomNumberGenerator 的每次调用应产生在 [0,1) 上均匀分布的浮点数。
explicit normal_distribution(const result_type& mean = 0,
const result_type& sigma = 1);
需求: sigma > 0
效果:构造一 normal_distribution
。mean
和 sigma
是分布的参数。
RealType mean() const
返回:分布的 "mean" 参数。
RealType sigma() const
返回:分布的 "sigma" 参数。
lognormal_distribution
类模板#include <boost/random/lognormal_distribution.hpp>
template<class RealType = double>
class lognormal_distribution
{
public:
typedef typename normal_distribution<RealType>::input_type
typedef RealType result_type;
explicit lognormal_distribution(const result_type& mean = 1.0,
const result_type& sigma = 1.0);
RealType& mean() const;
RealType& sigma() const;
void reset();
template<class UniformRandomNumberGenerator>
result_type operator()(UniformRandomNumberGenerator& urng);
};
lognormal_distribution
类模板的实例是 随机分布 的模型。对实数 x > 0,其密度 p(x) = 1/(x * normal_sigma * sqrt(2*pi)) * exp( -(log(x)-normal_mean)2 / (2*normal_sigma2) ),其中 normal_mean = log(mean2/sqrt(sigma2 + mean2)) 且 normal_sigma = sqrt(log(1 + sigma2/mean2))。对 UniformRandomNumberGenerator 的每次调用应产生在 [0,1) 上均匀分布的浮点数。
lognormal_distribution(const result_type& mean,
const result_type& sigma)
效果:构造一 lognormal_distribution
函子。mean
和 sigma
是分布的参数。
uniform_on_sphere
类模板#include <boost/random/uniform_on_sphere.hpp>
template<class RealType = double,
class Cont = std::vector<RealType> >
class uniform_on_sphere
{
public:
typedef RealType input_type;
typedef Cont result_type;
explicit uniform_on_sphere(int dim = 2);
void reset();
template<class UniformRandomNumberGenerator>
const result_type & operator()(UniformRandomNumberGenerator& urng);
};
uniform_on_sphere
类模板的实例是 随机分布 的模型。这一分布产生在 dim
维空间的单位球面上均匀分布的随机坐标。模板参数 Cont
应为一类 STL 的容器,其 begin
和 end
返回 Cont::iterator
类型的非 const 前向迭代器 (non-const forward iterator)。对 UniformRandomNumberGenerator 的每次调用应产生在 [0,1) 上均匀分布的浮点数。
explicit uniform_on_sphere(int dim = 2)
效果:构造一 uniform_on_sphere
函子。dim
是空间的维度。
代码实例:
#include "boost/scoped_ptr.hpp"
#include <boost/foreach.hpp>
#include <string>
#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <boost/array.hpp>
#include <boost/random.hpp>
#include "boost/weak_ptr.hpp"
uniform_int<> distribution(1, 100) ;
mt19937 engine ;
int iCount = 0;
variate_generator<mt19937, uniform_int<> > myrandom (engine, distribution);
for (int i=0; i<100; ++i)
{
iCount = myrandom() ;
TRACE("%d \r\n",iCount);
}