随机数
C++标准库定义了一组随机数引擎类和适配器,使用不同数学方法生成伪随机数。标准库还定义了一组分布模板,根据不同的概率分布生成随机数。引擎和分布类型的名字都与它们的数学性质相对应。定义在头文件random中。
随机数引擎操作 | |
---|---|
Engine e; | 默认构造函数;使用该引擎默认的种子 |
Engine e(s); | 使用整形s作为种子 |
e.seed(s) | 使用种子s重置引擎的状态 |
e.min() e.max() | 此引擎可生成的最小和最大值 |
Engine::result_type | 此引擎生成的unsigned整形类型 |
e.discard(u) | 将引擎推进u步;u的类型为unsigned long long |
大多数场合,随机数引擎的输出是不能直接使用的,这也是为什么早先我们称之为原始随机数。问题出在生成的随机数的值范围通常与我们需要的不符,而正确转换随机数的范围是极其困难的。
为了得到一个指定范围内的数,我们需要一个分布类型的对象。
分布类型的操作 | |
---|---|
Dist d; | 默认构造函数;使d准备好被使用。其他构造函数依赖于Dist的类型;分布类型的构造函数是explicit的 |
d(e) | 用相同的e连续调用d的话,会根据d的分布式类型生成一个随机数序列;e是一个随机数引擎对象 |
d.min() d.max() | 返回d(e)能生成的最小值和最大值 |
d.reset() | 重建d的状态,使得随后对d的使用不依赖于d已经生成的值 |
一个给定的随机数发生器一直会生成相同的随机数序列。一个函数如果定义了局部的随机数发生器,应该将其(包括引擎和分布对象)定义为static的。否则,每次调用函数都会生成相同的序列。
随机数分布
均匀分布
- uniform_int_distribution< IntT > u(m, n);
- uniform_real_distribution< RealT > u(x, y);
生成指定类型的,在给定包含范围内的值。m(或x)是可以返回的最小值;n(或y)是最大值。m默认为0;n默认为类型IntT对象可以表示的最大值。x默认为0.0,y默认为1.0。
伯努利分布
- bernoulli_distribution b( p );
以给定概率p生成true;p的默认值为0.5。 - binomial_distribution< IntT> b(t, p);
分布是按采样大小为整形值t,概率为p生成的;t的默认值为1,p的默认值为0.5。 - geometric_distribution< IntT > g§;
每次实验成功的概率为p;p的默认值为0.5。 - negative_binomial_distribution< IntT > nb(k, p);
k(整形值)次实验成功的概率为p;k的默认值为1,p的默认值为0.5。
泊松分布
- poisson_distribution< IntT > p(x);
均值为double值x的分布。 - exponential_distribution< RealT > e(lam);
指数分布,参数lambda通过浮点值lam给出;lam的默认值为1.0。 - gamma_distribution< RealT > g(a, b);
alpha(形状参数)为a,beta(尺度参数)为b;两者的默认值均为1.0。、 - weibull_distribution< RealT > w(a, b);
形状参数为a,尺度参数为b的分布;两者的默认值均为1.0。 - extreme_value_distribution< RealT > e(a, b);
a的默认值为0.0,b的默认值为1.0。
正太分布
- normal_distribution< RealT > n(m, s);
均值为m,标准差为s;m的默认值为0.0,s的默认值为1.0。 - lognormal_distribution< RealT > ln(m, s);
均值为m,标准差为s;m的默认值为0.0,s的默认值为1.0。 - chi_squared_distribution< RealT > c(x);
自由度为x;默认值为1.0。 - cauchy_distribution< RealT > c(a, b);
位置参数a和尺度参数b的默认值分别为0.0和1.0。 - fisher_f_distribution< RealT > f(m, n);
自由度为m和n;默认值均为1。 - student_t_distribution< RealT > s(n);
自由度为n;n的默认值均为1。
抽样分布
- discrete_distribution< IntT > d(i, j);
- discrete_distribution< IntT > d{il};
i和j是一个权重序列的输入迭代器,il是一个权重的花括号列表。权重必须能转换为double。 - piecewise_constant_distribution< RealT > pc(b, e, w);
b,e和w是输入迭代器。 - piecewise_linear_distribution< RealT > pl(b, e, w);
b,e和w是输入迭代器。
随机数引擎
标准库定义了三个类,实现了不同的算法来生成随机数。标准库还定义了三个适配器,可以修改给定引擎生成的序列。引擎和引擎适配器都是模板。于分布的参数不同,这些引擎的参数更为复杂,且需深入了解特定引擎使用的数学知识。
- default_random_engine
某个其他引擎类型的类别别名,目的是用于大多数情况。 - linear_congruenrtial_engine
minstd_rand0 的乘数为16807, 模为2147483647,增量为0。
minstd_rand 的乘数为48271,模为2147483647,增量为0。 - mersenne_twister_engine
mt19937 为32位无符号梅森旋转生成器
mt19937_64 为64位无符号梅森旋转生成器 - subtract_with_carry_engine
ranlux24_base 为32位无符号借位减法生成器。
ranlux48_base 为64位无符号借位减法生成器。 - discard_block_engine
引擎适配器,将其底层引擎的结果丢弃。用要使用的底层引擎,块大小和旧块大小来参数化。
ranlux24使用ranlux24_base引擎,块大小位223,旧块大小的23。
ranlux48使用ranlux48_base引擎,块大小位389,旧块大小的11。 - independent_bits_engine
引擎适配器,生成指定位数的随机数。用要使用的底层引擎,结果的位数以及保存生成的二进制位的无符号整形类型来参数化。指定的位数必须小于指定的无符号类型所能保存的位数。 - shuffle_order_engine
引擎适配器,返回的就是底层引擎生成的数,但返回的顺序不同。用要使用的底层引擎和要混洗的元素数目来参数化。
knuth_b使用minstd_rand0和表大小256。