推荐使用C++11的库生成随机数,示例:std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution dis(1, 100); 可确保高质量均匀分布,避免rand()的偏移问题,封装函数可提升效率。

在C++中生成随机数,推荐使用C++11引入的
<random>标准库,它比传统的
rand()函数更灵活、更高质量。下面介绍几种常用方法和技巧。
使用std::random_device和随机引擎
要生成真正意义上的随机种子,可以使用
std::random_device,它通常用于初始化伪随机数生成器。 示例代码:
#include <iostream>
#include <random>
<p>int main() {
std::random_device rd; // 真实随机数种子
std::mt19937 gen(rd()); // 使用梅森旋转算法的生成器</p><pre class="brush:php;toolbar:false;">std::uniform_int_distribution<> dis(1, 100); // 分布:1到100之间的整数
for (int i = 0; i < 5; ++i) {
std::cout << dis(gen) << " ";
}
std::cout << std::endl;
return 0;
}
说明:
- std::random_device 提供非确定性随机数(如果系统支持)。
- std::mt19937 是常用的高性能伪随机数引擎。
- std::uniform_int_distribution 保证结果在指定范围内均匀分布。
生成不同类型的随机数
根据需要选择合适的分布类型:
-
整数随机数:用
std::uniform_int_distribution<>
-
浮点随机数:用
std::uniform_real_distribution<>
-
正态分布:用
std::normal_distribution<>
浮点示例:
立即学习“C++免费学习笔记(深入)”;
std::uniform_real_distribution<> dis(0.0, 1.0); double random_value = dis(gen);
避免常见错误
使用旧式
rand() % N会产生偏移,且质量差。应避免以下做法:
- 不要重复构造随机引擎或分布对象(影响性能)
- 不要每次用
time(nullptr)
做种子(在同一秒内运行会得到相同序列) - 避免
rand()
和srand()
,它们不是类型安全的,且分布不均
封装成可复用函数
可以将随机数生成封装为静态局部变量形式,提高效率:
int random_int(int min, int max) {
static std::random_device rd;
static std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(min, max);
return dis(gen);
}
这样每次调用只创建分布对象,引擎只初始化一次。
基本上就这些。C++标准库提供了强大而现代的随机数工具,合理使用能写出更可靠、更高效的代码。











