C++ 的随机数
随机数由两部分组成:
- 随机数生成引擎
- 随机数分布类
1、随机数引擎
常见的随机数生成引擎由:
linear_congruential_engine
线性同余算法mersenne_twister_engine
梅森旋转素数算法,常常使用std::mt19937
这个类型subtract_with_carry_engine
带进位的线性同余
随机数生成引擎生成的序列是可预知的,可以提供一个 seed
值去改变随机序列的位置
可以通过非确定性随机数(真随机数)作为随机数引擎的 seed
std::random_device
是产生真随机数的对象,在 linux
里面,它对应的是 /dev/urandom
设备
非确定性随机数是完全随机的,可以直接使用,但是我们更想要的是低差异序列,所以一般不直接使用真随机数
2、随机数分布
根据概率论,任意分布都可以由均匀分布得到。随机数引擎提供的是均匀分布的随机数序列,随机数分布类可以变换得到符合各种分布的随机数序列,如正态分布等。
3、使用示例
#include <random>
/* 生成范围在 [0.0, 1.0] 的浮点随机数 */
float float_random_get() {
std::random_device dev; // 用作 seed
std::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());
}
}