C++随机数生成代码解析
srand(time(0))、rand() % (max - min + 1) + min 的原理与使用
-
随机数初始化:srand(time(0))
作用
srand() 用于初始化随机数生成器的种子(seed)。time(0) 返回当前时间(从1970年1月1日至今的秒数),确保每次运行程序时种子不同,从而生成不同的随机数序列。
为什么需要 srand(time(0))?
如果不调用 srand(),rand() 每次运行程序都会生成相同的随机数序列(因为默认种子固定)。使用 time(0) 作为种子,可以让程序每次运行时产生不同的随机数。
示例
#include <cstdlib> // for rand(), srand() #include <ctime> // for time() int main() { srand(time(0)); // 初始化随机种子 int random_num = rand(); // 生成随机数 return 0; }
-
生成指定范围的随机数:rand() % (max - min + 1) + min
公式int random_num = rand() % (max - min + 1) + min;
生成 [min, max] 之间的随机整数。
关键点
rand() % N 的范围是 [0, N-1]例如 rand() % 10 生成 [0, 9] 的随机数。
(max - min + 1) 的作用
max - min 计算范围大小,但 rand() % (max - min) 只能生成 [0, max - min - 1]。
+1 是为了让 rand() % (max - min + 1) 的范围变成 [0, max - min],这样 + min 后才能覆盖 [min, max]。
- min 的作用
将 [0, max - min] 偏移到 [min, max]。
示例
生成 [10, 99] 的随机数:
int num = rand() % (99 - 10 + 1) + 10; // rand() % 90 + 10 → [10, 99]
99 - 10 + 1 = 90,所以 rand() % 90 生成 [0, 89]。
-
10 后变成 [10, 99]。
常见错误
❌ 错误写法(漏掉 +1):
int num = rand() % (99 - 10) + 10; // rand() % 89 + 10 → [10, 98](漏掉99)
rand() % 89 的范围是 [0, 88],+10 后变成 [10, 98],无法生成 99。
-
为什么使用 (max - min + 1) 而不是直接写数字?
原因
提高代码可读性rand() % (99 - 10 + 1) + 10 比 rand() % 90 + 10 更直观,直接体现范围 [10, 99]。
便于修改范围
如果想改成 [20, 50],只需修改参数:
rand() % (50 - 20 + 1) + 20; // rand() % 31 + 20 → [20, 50]
而不需要手动计算 50 - 20 + 1 = 31,减少错误。
- 完整示例
生成两个 [10, 99] 的随机数:
#include <iostream>
#include <cstdlib>
#include <ctime>
int main() {
srand(time(0)); // 初始化随机种子
int shu1 = rand() % (99 - 10 + 1) + 10; // [10, 99]
int shu2 = rand() % (99 - 10 + 1) + 10; // [10, 99]
std::cout << "随机数1: " << shu1 << std::endl;
std::cout << "随机数2: " << shu2 << std::endl;
return 0;
}
输出示例:
随机数1: 57
随机数2: 82
- 总结
关键点 说明
srand(time(0)) 初始化随机种子,确保每次运行程序生成不同的随机数序列。
rand() % N 生成 [0, N-1] 的随机整数。
(max - min + 1) 计算范围大小,确保 rand() 能覆盖 [0, max - min]。- min 将范围偏移到 [min, max]。
推荐写法 rand() % (max - min + 1) + min(比直接写数字更易读、易维护)。
适用场景:随机密码生成、随机算术题、游戏随机事件等。
- min 将范围偏移到 [min, max]。