跳转到内容

C++/random

维基教科书,自由的教学读本
< C++

random为随机数库的头文件,提供产生随机数与伪随机数的类。

生成器与分布概述

[编辑]
  • 均匀随机比特生成器(Uniform random bit generator,URBG),产生均匀分布的整数的序列:包括:
    • 随机数引擎(random number engine):产生伪随机的均匀分布的整数的序列
      • linear_congruential_engine 类模板: 线性同余算法
      • mersenne_twister_engine 类模板: 梅森旋转算法
      • subtract_with_carry_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生成的最大可能值