C++ 的随机数
随机数由两部分组成:
- 随机数生成引擎
- 随机数分布类
1、随机数引擎
常见的随机数生成引擎由:
linear_congruential_engine线性同余算法mersenne_twister_engine梅森旋转素数算法,常常使用std::mt19937这个类型subtract_with_carry_engine带进位的线性同余
随机数生成引擎生成的序列是可预知的,可以提供一个 seed 值去改变随机序列的位置
可以通过非确定性随机数(真随机数)作为随机数引擎的 seedstd::random_device 是产生真随机数的对象,在 linux 里面,它对应的是 /dev/urandom 设备
非确定性随机数是完全随机的,可以直接使用,但是我们更想要的是低差异序列,所以一般不直接使用真随机数
2、随机数分布
根据概率论,任意分布都可以由均匀分布得到。随机数引擎提供的是均匀分布的随机数序列,随机数分布类可以变换得到符合各种分布的随机数序列,如正态分布等。
3、使用示例
#include <random>/* 生成范围在 [0.0, 1.0] 的浮点随机数 */float float_random_get() {std::random_device dev; // 用作 seedstd::mt19937 engine(dev()); // 随机数引擎,这里是梅森旋转素数法// 范围为 [0.0, 1.0] 的均匀分布std::uniform_real_distribution<float> dist(0.f, 1.f);// 使用 std::uniform_int_distribution 可以得到 int 的return dist(engine);}
C 的随机数
使用 rand()得到伪随机数,使用 srand(...)设置随机数的种子。
注:默认使用 srand(1)来设置种子。
随机数的范围是:[0, RAND_MAX]
使用示例:
#include <stdlib.h>#include <time.h>#include <stdio.h>int main() {srand(time(NULL));for (int i = 0; i < 5; i++) {printf("%d ", rand());}}
