【C++学习笔记】伪随机数生成
1.1 底层原理与细节
伪随机数生成在游戏、仿真和加密中有广泛应用。C++11的<random>
库取代了不可靠的rand()
,提供了基于数学算法的随机数引擎(如std::mt19937
,梅森旋转算法)和分布类。
引擎:
伪随机数生成器(如
std::mt19937
,梅森旋转算法),可生成高质量随机序列。非确定性引擎(如
std::random_device
,依赖系统熵源,用于种子初始化)。std::random_device rd; // 非确定性种子源 std::mt19937 gen(rd()); // 使用种子初始化Mersenne Twister引擎
分布:如
std::uniform_int_distribution
,通过数学变换将引擎输出映射到均匀分布区std::uniform_int_distribution<int> dist(1, 6);
// 1到6的均匀整数std::normal_distribution<double> dist(0.0, 1.0);
// 均值为0,标准差为1的正态分布std::bernoulli_distribution dist(0.3);
// 成功概率0.3的伯努利分布
底层实现避免了全局状态(如rand()
的静态种子),支持线程安全和可重现性。
1.2 小案例:高质量随机数生成
#include <iostream>
#include <random>int main() {std::random_device rd; // 硬件熵源种子std::mt19937 gen(rd()); // 梅森旋转引擎std::uniform_int_distribution<int> dist(1, 10); // 均匀分布[1, 10]std::cout << "5个随机数: ";for (int i = 0; i < 5; ++i) {std::cout << dist(gen) << " ";}std::cout << std::endl;return0;
}
2 demo
生成浮点数
std::uniform_real_distribution<double> dist(0.0, 1.0);
double val = dist(gen); // [0,1)区间的浮点数
生成非均匀分布
std::normal_distribution<double> nd(5.0, 2.0); // 均值5,标准差2
double x = nd(gen);
离散分布
std::discrete_distribution<int> dist{1, 2, 3}; // 概率权重1:2:3
int index = dist(gen); // 返回0/1/2,概率分别为1/6, 2/6, 3/6