一切都好说
回答者
回答于 2026-10-23
C++标准库中的rand()函数生成的是伪随机数,其底层依赖一个初始种子(seed)。如果程序中没有显式设置种子,rand()会默认使用固定种子值1。因此每次运行程序时,伪随机数发生器从相同起点计算,必然输出完全相同的数字序列。
解决方法
在首次调用rand()之前,使用srand()函数设置一个随时间变化的种子,通常取当前系统时间:
#include <cstdlib>
#include <ctime>
int main() {
srand(static_cast<unsigned int>(time(nullptr)));
int secret = rand() % 100 + 1; // 生成1到100的随机数
return 0;
}
步骤说明
- 引入
<cstdlib>以使用rand()和srand(),引入<ctime>以使用time()。 - 在程序初始化阶段(如
main函数开头)调用一次srand(time(nullptr))。 - 后续通过
rand()获取随机数,并用取模运算限定范围。
判断依据
- 若多次运行间隔超过1秒,
time(nullptr)返回值不同,种子即不同,随机数序列随之改变。 - 若在同一秒内连续启动多次程序,
time()返回值相同,仍会产生相同结果。
适用条件
srand()+rand()适用于普通游戏、练习项目等对随机性要求不高的场景。
常见误区
- 在循环内部反复调用
srand(time(nullptr)):由于time()精度为秒,同一秒内的多次调用会重置为相同种子,反而导致连续生成相同的数。整个程序生命周期内只需调用一次srand()。 - 认为
rand()是真随机数:它是确定性算法产生的伪随机序列,不适合密码学或高安全性场景。C++11起推荐使用<random>头文件中的std::mt19937引擎配合std::random_device获取更高质量的随机数。