C++ 标准库中的 <random> 头文件提供了一组用于生成随机数的工具,涵盖了从简单的均匀分布到复杂的离散分布,为需要随机数的应用程序提供了广泛的选择。这些工具对于模拟、游戏开发、加密算法等领域非常有用。
<random> 不仅支持生成伪随机数,还支持种子控制、各种概率分布等,使得开发者可以灵活地生成符合特定需求的随机数序列。
<random> 库由以下三个主要组件构成:
在 C++ 中,随机数生成器(Random Number Generator, RNG)可以分为两大类:
常用随机数引擎
std::default_random_engine
std::minstd_rand
std::mt19937
std::mt19937_64
std::ranlux24_base
std::knuth_b
常用引擎如 std::mt19937 因为生成速度快且生成质量高,是普遍推荐的随机数生成引擎。生成器还可以使用 seed() 方法指定种子,便于生成可重复的伪随机序列。
seed()
随机数分布类型
1、均匀分布
std::uniform_int_distribution
std::uniform_real_distribution
std::mt19937 gen(seed); std::uniform_int_distribution<int> dist(1, 100); // 生成 1 到 100 间的整数 int random_int = dist(gen);
2、正态分布
std::normal_distribution
std::lognormal_distribution
std::mt19937 gen(seed); std::normal_distribution<> dist(0, 1); // 平均值为0,标准差为1 double random_normal = dist(gen);
3、离散分布
std::discrete_distribution
std::bernoulli_distribution
true
false
std::binomial_distribution
std::mt19937 gen(seed); std::discrete_distribution<int> dist({40, 10, 50}); // 概率为40%、10%、50% int random_discrete = dist(gen);
语法
使用 <random> 库的基本步骤如下:
实例
生成基本的随机数
#include <iostream>#include <random> int main() { // 使用随机设备创建一个随机种子 std::random_device rd; // 使用随机种子初始化 Mersenne Twister 随机数生成器 std::mt19937 generator(rd()); // 生成一个随机数 std::cout << "Random number: " << generator() << std::endl; return 0;}
输出结果:
Random number: 3499211612
注意:每次运行程序时,生成的随机数可能不同。
使用均匀分布
#include <iostream>#include <random> int main() { // 创建随机数生成器 std::mt19937 generator; // 创建一个均匀分布的随机数生成器,范围从 1 到 10 std::uniform_int_distribution<int> distribution(1, 10); // 生成并打印 5 个随机数 for (int i = 0; i < 5; ++i) { std::cout << "Random number: " << distribution(generator) << std::endl; } return 0;}
Random number: 7 Random number: 10 Random number: 6 Random number: 2 Random number: 4
每次运行程序时,输出的随机数序列可能不同。
使用正态分布
#include <iostream>#include <random>#include <iomanip> int main() { // 创建随机数生成器 std::mt19937 generator; // 创建一个正态分布的随机数生成器,均值为 0,标准差为 1 std::normal_distribution<double> distribution(0.0, 1.0); // 设置输出格式,保留两位小数 std::cout << std::fixed << std::setprecision(2); // 生成并打印 5 个随机数 for (int i = 0; i < 5; ++i) { std::cout << "Random number: " << distribution(generator) << std::endl; } return 0;}
输出结果
Random number: -0.15 Random number: 0.13 Random number: -1.87 Random number: 0.46 Random number: -0.21
使用 mt19937 引擎生成不同分布的随机数:
#include <iostream>#include <random> int main() { // 1. 设置种子和随机数引擎 std::random_device rd; // 随机设备产生种子 std::mt19937 gen(rd()); // 梅森旋转引擎 // 2. 均匀分布的整数 std::uniform_int_distribution<> dist_int(1, 100); std::cout << "Uniform integer: " << dist_int(gen) << std::endl; // 3. 均匀分布的浮点数 std::uniform_real_distribution<> dist_real(0.0, 1.0); std::cout << "Uniform real: " << dist_real(gen) << std::endl; // 4. 正态分布 std::normal_distribution<> dist_normal(0, 1); std::cout << "Normal: " << dist_normal(gen) << std::endl; // 5. 离散分布 std::discrete_distribution<> dist_discrete({10, 20, 70}); std::cout << "Discrete: " << dist_discrete(gen) << std::endl; return 0;}
随机数适配器
机数适配器允许调整生成行为,主要有两类适配器:
#include <iostream>#include <random> int main() { std::random_device rd; std::mt19937 gen(rd()); std::discard_block_engine<std::mt19937, 3, 2> discard_engine(gen); std::cout << "Discard block random number: " << discard_engine() << std::endl; return 0;}
常见用法