C++ 的随机数

随机数由两部分组成:

  1. 随机数生成引擎
  2. 随机数分布类

1、随机数引擎

常见的随机数生成引擎由:

  • linear_congruential_engine 线性同余算法
  • mersenne_twister_engine 梅森旋转素数算法,常常使用 std::mt19937 这个类型
  • subtract_with_carry_engine 带进位的线性同余

随机数生成引擎生成的序列是可预知的,可以提供一个 seed 值去改变随机序列的位置

可以通过非确定性随机数(真随机数)作为随机数引擎的 seed
std::random_device 是产生真随机数的对象,在 linux 里面,它对应的是 /dev/urandom 设备

非确定性随机数是完全随机的,可以直接使用,但是我们更想要的是低差异序列,所以一般不直接使用真随机数

2、随机数分布

根据概率论,任意分布都可以由均匀分布得到。随机数引擎提供的是均匀分布的随机数序列,随机数分布类可以变换得到符合各种分布的随机数序列,如正态分布等。

3、使用示例

  1. #include <random>
  2. /* 生成范围在 [0.0, 1.0] 的浮点随机数 */
  3. float float_random_get() {
  4. std::random_device dev; // 用作 seed
  5. std::mt19937 engine(dev()); // 随机数引擎,这里是梅森旋转素数法
  6. // 范围为 [0.0, 1.0] 的均匀分布
  7. std::uniform_real_distribution<float> dist(0.f, 1.f);
  8. // 使用 std::uniform_int_distribution 可以得到 int 的
  9. return dist(engine);
  10. }

C 的随机数

使用 rand()得到随机数,使用 srand(...)设置随机数的种子。
注:默认使用 srand(1)来设置种子。
随机数的范围是:[0, RAND_MAX]

使用示例:

  1. #include <stdlib.h>
  2. #include <time.h>
  3. #include <stdio.h>
  4. int main() {
  5. srand(time(NULL));
  6. for (int i = 0; i < 5; i++) {
  7. printf("%d ", rand());
  8. }
  9. }