C++/random
< C++
random为随机数库的头文件,提供产生随机数与伪随机数的类。
生成器与分布概述
编辑- 均匀随机比特生成器(Uniform random bit generator,URBG),产生均匀分布的整数的序列:包括:
- 随机数引擎(random number engine):产生伪随机的均匀分布的整数的序列
- linear_congruential_engine 类模板: 线性同余算法
- mersenne_twister_engine 类模板: 梅森旋转算法
- subtract_with_carry_engine 类模板:带进位减法的滞后斐波那契随机数算法
- 真随机数引擎,如果有的话
- 随机数引擎(random number engine):产生伪随机的均匀分布的整数的序列
- 随机数分布(Distributions),如均匀分布、正态分布、泊松分布,即把均匀分布的随机数转为不同的统计分布。
- 随机数引擎适配器使用基础随机数引擎产生伪随机数,通常用于改变谱特性:
- discard_block_engine 类模板:抛弃随机数引擎的一些输出
- independent_bits_engine 类模板:把随机数引擎的输出包装为特定比特数的块
- shuffle_order_engine 类模板:把随机数引擎的输出按照不同的序递交
示例:
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(1,6);
int dice_roll = distribution(generator); // generates number in the range 1..6
//Code copied from https://codereview.stackexchange.com/questions/109260/seed-stdmt19937-from-stdrandom-device
std::vector<uint32_t> random_data(624);
std::random_device source;
std::generate(random_data.begin(), random_data.end(), std::ref(source));
std::seed_seq seeds(random_data.begin(), random_data.end());
std::mt19937 engine(seeds);
//Or:
//std::mt19937_64 engine(seeds);
using mt_engine = std::mersenne_twister_engine</*...*/>;
constexpr size_t state_size = mt_engine::state_size * mt_engine::word_size / 32;
std::vector<uint32_t> random_data(state_size);
预定义的随机数引擎
编辑- minstd_rand0: std::linear_congruential_engine<std::uint_fast32_t, 16807, 0, 2147483647>。1969由Lewis, Goodman与Miller提出,1988年被Park与Miller称作"Minimal standard"
- minstd_rand: std::linear_congruential_engine<std::uint_fast32_t, 48271, 0, 2147483647>。更新的"Minimum standard"。1993年由Park, Miller与Stockmeyer提出。
- mt19937:std::mersenne_twister_engine<std::uint_fast32_t, 32, 624, 397, 31,0x9908b0df, 11,0xffffffff, 7,0x9d2c5680, 15,0xefc60000, 18, 1812433253>。32比特梅森旋转法,1998年由Matsumoto与Nishimura
- mt19937_64:std::mersenne_twister_engine<std::uint_fast64_t, 64, 312, 156, 31,0xb5026f5aa96619e9, 29,0x5555555555555555, 17,0x71d67fffeda60000, 37,0xfff7eee000000000, 43, 6364136223846793005>。2000年由Matsumoto与Nishimura提出的64比特梅森旋转法。
- ranlux24_base:std::subtract_with_carry_engine<std::uint_fast32_t, 24, 10, 24>
- ranlux48_base:std::subtract_with_carry_engine<std::uint_fast64_t, 48, 5, 12>
- ranlux24:std::discard_block_engine<std::ranlux24_base, 223, 23>。24比特RANLUX生成器,1994年由Martin Lüscher与Fred James
- ranlux48:std::discard_block_engine<std::ranlux48_base, 389, 11>。48比特RANLUX生成器,1994年由Martin Lüscher与Fred James
- knuth_b:std::shuffle_order_engine<std::minstd_rand0, 256>。
- default_random_engine:由实现定义。可能是std::mt19937的别名。
- std::random_device:由硬件熵源。但如果没有真随机数发生器,也可以用伪随机数代替。Visual C++编译器保证产生密码级安全的伪随机数。
随机数分布
编辑- 均匀分布
- uniform_int_distribution类模板
- uniform_real_distribution类模板
- 伯努利分布
- bernoulli_distribution类
- binomial_distribution类模板
- negative_binomial_distribution类模板
- geometric_distribution类模板
- 泊松分布
- poisson_distribution类模板
- exponential_distribution类模板
- gamma_distribution类模板
- weibull_distribution类模板
- extreme_value_distribution类模板
- 正态分布
- normal_distribution类模板
- lognormal_distribution类模板
- chi_squared_distribution类模板
- cauchy_distribution类模板
- fisher_f_distribution类模板
- student_t_distribution类模板
- 采样分布
- discrete_distribution类模板
- piecewise_constant_distribution类模板
- piecewise_linear_distribution类模板
- 工具
- generate_canonical函数模板:在[0, 1)中给定精度均匀分布
- seed_seq类:通用无偏种子序列生成器。消耗构造时传入的一个序列的整数值,产生32比特均匀分布的一个整数值。用于给多个随机数引擎作种子或者一个随机数引擎需要多个种子。
C语言随机库
编辑不建议使用,定义在头文件<cstdlib>
- rand函数:产生伪随机数
- srand函数:设置随机数种子
- RAND_MAX宏常量:std::rand生成的最大可能值