隨機數庫:分佈

簡介

除了 隨機數生成器 之外,本庫還提供了把一種分佈 (通常是生成器產生的均勻分佈) 映射到另一種分佈的分佈函數。(譯註:在本節中,「分佈」指統計學意義上的分佈,而「分佈函數」指的是類模板。內部的隨機數生成器有時會更一般地被稱為「隨機數源」。)

對於某一映射通常會有多種實現方案:有的需要較多的空間和對內部隨機數源的調用,而有的需要進行較多的費時的運算 (如三角函數)。以下給出的對接口的描述是與具體實現無關的;然而,如果某一實現不能覆蓋特定分佈的全部值域,或者不符合該分佈的統計學性質,該實現是無效的。

分佈 描述 實例
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]), because this is redundant given the Generator interface and imposes a run-time overhead on all users. Moreover, a Generator interface appeals to random number generation as being more "natural". Use an iterator adaptor if you need to wrap any of the generators in an input iterator interface.

下面描述的所有分佈函數都保存對隨機數源的一個非 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) 中各數概率相對差的平方和。 The property can be fulfilled with the calculation (base_rng mod rout), as follows: Let r = rbase mod rout. The base distribution on rbase is folded onto the range rout. The numbers i < r have assigned (rbase div rout)+1 numbers of the base distribution, the rest has only (rbase div rout). Therefore, pout_s(i) = ((rbase div rout)+1) / rbase for i < r and pout_s(i) = (rbase div rout)/rbase otherwise. Substituting this in the above sum formula leads to the desired result.

Note: The upper bound for (rbase mod rout)(rout - rbase mod rout) is rout2/4. Regarding the upper bound for the square sum of the relative quantization error of rout3/(4*rbase2), it seems wise to either choose rbase so that rbase > 10*rout2 or ensure that rbase is divisible by rout.

成員

uniform_smallint(IntType min, IntType max)

效果:構造一 uniform_smallint 函子。minmax 分別為輸出值域的上下界。

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 對象。minmax 為分佈的參數。

    result_type min() const

返回:分佈的 "min" 參數。

    result_type max() const

返回:分佈的 "max" 參數。

    result_type operator()(UniformRandomNumberGenerator& urng, result_type n)

返回:在值域 0 <= x < n 內均勻分佈的隨機數 x。[注記:This allows a variate_generator object with a uniform_int distribution to be used with std::random_shuffe, see [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 必須為一類數字的值類型,必須支持到 RealTypestatic_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 對象。minmax 是分佈的參數。

    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_distributionmeansigma 是分佈的參數。

    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 函子。meansigma 是分佈的參數。

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 的容器,其 beginend 返回 Cont::iterator 類型的非 const 前向迭代器 (non-const forward iterator)。對 UniformRandomNumberGenerator 的每次調用應產生在 [0,1) 上均勻分佈的浮點數。

成員

explicit uniform_on_sphere(int dim = 2)

效果:構造一 uniform_on_sphere 函子。dim 是空間的維度。


Valid HTML 4.01 Transitional

Revised 05 December, 2006

Copyright © 2000-2007 Jens Maurer

Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

中文版修訂:2009/1/25

Copyright © 2008 xiaq

在 Boost Software License, Version 1.0 的條款下發佈。(參看文件 LICENSE_1_0.txt 或在線副本 http://www.boost.org/LICENSE_1_0.txt)