在C++11之前,生成随机数的方式主要是通过rand()
函数,但这种方法存在许多不足,比如随机性不够、重复性高等问题。C++11引入了全新的<random>
库,为生成随机数提供了更强大和灵活的支持。
1. <random>
库的基本组成
C++11的<random>
库包含以下几个主要组成部分:
- 随机数引擎:生成伪随机数的核心组件。
- 随机数分布:定义生成的随机数应该遵循的分布类型。
- 种子:用于初始化随机数引擎,确保生成的随机数序列的唯一性。
2. 随机数引擎
随机数引擎负责生成基础的随机数序列。常用的随机数引擎包括:
-
std::default_random_engine
:默认的随机数引擎。 -
std::mt19937
:Mersenne Twister引擎,生成高质量的伪随机数。 -
std::ranlux24_base
:一种高质量的线性同余引擎。 -
std::knuth_b
:基于Knuth算法的随机数引擎。
示例
#include <iostream>
#include <random>
int main() {
// 使用默认随机数引擎
std::default_random_engine generator;
// 生成一个随机数
int random_number = generator();
std::cout << "Random number: " << random_number << std::endl;
return 0;
}
3. 随机数分布
随机数分布决定了生成的随机数的分布方式。常用的分布包括:
-
均匀分布:
std::uniform_int_distribution
(整数均匀分布)、std::uniform_real_distribution
(浮点数均匀分布)。 -
正态分布:
std::normal_distribution
。 -
伯努利分布:
std::bernoulli_distribution
。 -
泊松分布:
std::poisson_distribution
。
示例:生成均匀分布的整数
#include <iostream>
#include <random>
int main() {
std::random_device rd; // 用于获取真随机数种子
std::mt19937 gen(rd()); // 使用Mersenne Twister引擎
std::uniform_int_distribution<> dis(1, 100); // 定义均匀分布,范围1到100
// 生成并打印10个随机数
for (int n = 0; n < 10; ++n) {
std::cout << dis(gen) << ' ';
}
std::cout << std::endl;
return 0;
}
示例:生成正态分布的浮点数
#include <iostream>
#include <random>
int main() {
std::random_device rd; // 用于获取真随机数种子
std::mt19937 gen(rd()); // 使用Mersenne Twister引擎
std::normal_distribution<> dis(0, 1); // 定义正态分布,均值0,标准差1
// 生成并打印10个随机数
for (int n = 0; n < 10; ++n) {
std::cout << dis(gen) << ' ';
}
std::cout << std::endl;
return 0;
}
4. 设置种子
种子是初始化随机数引擎的关键。不同的种子会生成不同的随机数序列。通常使用std::random_device
生成一个真随机数来作为种子。
示例:使用固定种子
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(12345); // 使用固定种子12345
std::default_random_engine gen((unsigned int)time(0));//随机种子
std::uniform_int_distribution<> dis(1, 100);
// 生成并打印10个随机数
for (int n = 0; n < 10; ++n) {
std::cout << dis(gen) << ' ';
}
std::cout << std::endl;
return 0;
}
5. 实用技巧
5.1 生成范围内的随机整数
使用std::uniform_int_distribution
可以轻松生成指定范围内的随机整数:
#include <iostream>
#include <random>
int main() {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(10, 20); // 范围10到20
std::cout << "Random number between 10 and 20: " << dis(gen) << std::endl;
return 0;
}
5.2 生成范围内的随机浮点数
使用std::uniform_real_distribution
可以生成指定范围内的随机浮点数:
#include <iostream>
#include <random>
int main() {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(0.0, 1.0); // 范围0.0到1.0
std::cout << "Random float between 0.0 and 1.0: " << dis(gen) << std::endl;
return 0;
}
结论
C++11的<random>
库提供了强大而灵活的随机数生成功能,通过组合不同的随机数引擎和分布,可以满足各种随机数生成需求。相比于传统的rand()
函数,<random>
库在生成随机数的质量和控制性上都有显著提升。