C++ 随机数函数
在编程中,随机数是一个非常有用的工具,可以应用于游戏开发、模拟、加密和测试等多个领域。C++提供了多种生成随机数的方法,从传统的C风格函数到现代C++的随机数库。本文将全面介绍C++中的随机数函数及其使用方法。
传统随机数生成:rand() 函数
基本用法
最简单的随机数生成方法是使用C标准库中的rand()
函数,它包含在<cstdlib>
头文件中。
#include <iostream>
#include <cstdlib> // 包含rand()函数
#include <ctime> // 包含time()函数
int main() {
// 设置随机数种子
srand(time(0));
// 生成一个随机数
int randomNumber = rand();
std::cout << "随机数: " << randomNumber << std::endl;
return 0;
}
输出示例:
随机数: 1804289383
注意
每次运行程序时,如果不设置种子或使用相同的种子,rand()
函数会生成相同的随机数序列。这就是为什么我们使用srand(time(0))
来基于当前时间设置种子。
生成指定范围内的随机数
rand()
函数生成的是0到RAND_MAX
(通常是32767)之间的随机数。要生成特定范围内的随机数,可以使用以下公式:
int randomInRange = min + rand() % (max - min + 1);
示例:生成1到100之间的随机数
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
srand(time(0));
// 生成1到100之间的随机数
int randomNumber = 1 + rand() % 100;
std::cout << "1到100之间的随机数: " << randomNumber << std::endl;
return 0;
}
输出示例:
1到100之间的随机数: 42
现代C++随机数生成
从C++11开始,<random>
头文件引入了更强大、更灵活的随机数生成工具。这些工具包括随机数引擎和分布。
随机数引擎与分布
随机数生成过程分为两步:
- 使用随机数引擎生成均匀分布的随机数
- 使用分布对象将这些随机数转换为所需的分布
#include <iostream>
#include <random>
int main() {
// 创建一个随机数引擎
std::random_device rd; // 用于获取真随机数种子
std::mt19937 gen(rd()); // Mersenne Twister 随机数引擎
// 创建一个均匀分布
std::uniform_int_distribution<> distrib(1, 100);
// 生成随机数
int randomNumber = distrib(gen);
std::cout << "1到100之间的随机数: " << randomNumber << std::endl;
return 0;
}
输出示例:
1到100之间的随机数: 73
常用的随机数引擎
std::random_device
: 生成非确定性随机数,适合作为种子std::mt19937
: Mersenne Twister 引擎,生成高质量的伪随机数std::default_random_engine
: 默认随机数引擎,具体实现取决于编译器
常用的分布类型
- 均匀分布
std::uniform_int_distribution
: 均匀分布的整数std::uniform_real_distribution
: 均匀分布的实数
// 生成1到100之间的均匀分布整数
std::uniform_int_distribution<int> intDistrib(1, 100);
// 生成0.0到1.0之间的均匀分布实数
std::uniform_real_distribution<double> realDistrib(0.0, 1.0);
- 正态分布
std::normal_distribution
: 正态(高斯)分布的数值
// 均值为0,标准差为1的正态分布
std::normal_distribution<double> normalDistrib(0.0, 1.0);
- 其他分布
std::bernoulli_distribution
: 伯努利分布std::binomial_distribution
: 二项分布std::poisson_distribution
: 泊松分布
生成随机字符和字符串
利用随机数函数,我们可以生成随机字符和字符串:
#include <iostream>
#include <random>
#include <string>
std::string generateRandomString(int length) {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> distrib(97, 122); // ASCII for 'a' to 'z'
std::string result;
for (int i = 0; i < length; ++i) {
result += static_cast<char>(distrib(gen));
}
return result;
}
int main() {
std::string randomStr = generateRandomString(8);
std::cout << "随机字符串: " << randomStr << std::endl;
return 0;
}
输出示例:
随机字符串: wdhmtxpq