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生成的最大可能值