推荐使用 uniform_int_distribution 配合 std::mt19937 生成指定范围随机数,需包含 头文件,创建随机数引擎并用 random_device 初始化种子,定义 uniform_int_distribution 对象指定范围 [min, max],复用引擎和分布对象以确保随机性质量,避免每次循环重建引擎导致重复值,适用于掷骰子、随机抽样等场景,比 rand() % n 更均匀安全。

在C++中生成指定范围的随机数,推荐使用 uniform_int_distribution 配合随机数引擎(如 std::mt19937)来实现。这种方式比传统的 rand() % N 更加均匀、安全且符合现代C++标准。
1. uniform_int_distribution 简介
std::uniform_int_distribution 是 C++ 标准库中的一个类,定义在 random 头文件中,用于生成指定范围内均匀分布的整数。
它的构造函数接受两个参数:最小值和最大值(闭区间),即 [min, max]。
2. 基本用法步骤
要正确使用 uniform_int_distribution,需要以下三步:
立即学习“C++免费学习笔记(深入)”;
- 包含头文件:#include
- 创建随机数引擎(如 std::mt19937)
- 定义 uniform_int_distribution 对象并绑定引擎生成随机数
示例代码:生成 1 到 100 之间的随机整数
#include <iostream>
#include <random>
<p>int main() {
// 创建随机数引擎,使用随机种子
std::random_device rd; // 真实随机数种子
std::mt19937 gen(rd()); // Mersenne Twister 引擎</p><pre class='brush:php;toolbar:false;'>// 定义分布:[1, 100]
std::uniform_int_distribution<int> dis(1, 100);
// 生成5个随机数
for (int i = 0; i < 5; ++i) {
int random_num = dis(gen);
std::cout << random_num << " ";
}
std::cout << std::endl;
return 0;}
3. 关键注意事项
避免常见错误,确保随机性质量:
- 不要重复创建引擎和分布对象:应复用引擎实例,否则可能因频繁初始化导致相同数值
- 使用 random_device 获取种子:比 time(0) 更安全,尤其在多线程或快速重启场景下
- 分布对象可复用:设置好后可以多次调用,适用于循环或频繁生成
错误示例(不推荐):
// 每次都创建新引擎 —— 可能产生相同结果!
for (int i = 0; i < 5; ++i) {
std::mt19937 bad_gen(std::time(0));
std::uniform_int_distribution<int> d(1, 10);
std::cout << d(bad_gen) << " ";
}
4. 实际应用场景
可用于模拟掷骰子、抽签、数组索引随机访问等:
// 模拟掷六面骰子 std::uniform_int_distribution<int> dice(1, 6); int roll = dice(gen);
或从 vector 中随机选取元素:
std::vector<std::string> items = {"apple", "banana", "cherry"};
std::uniform_int_distribution<int> index(0, items.size() - 1);
std::string selected = items[index(gen)];
基本上就这些。使用 uniform_int_distribution 能让你写出更清晰、更可靠的随机数代码,避免旧式 rand() 的偏差问题。关键是搭配合适的引擎并正确初始化种子。










