在 C++ 代码中,执行 srand(0) 后连续两次执行 rand() 的结果相等。( )
这题考的是伪随机数生成器的核心机制。拿到题先想:srand 是干嘛的?rand 又是干嘛的?别被'随机'二字骗了,它们本质是确定性算法。思路就一条:看种子是否改变,看内部状态是否更新。
最容易栽跟头的就是死记硬背'rand 生成随机数'这个结论,却完全没理解'伪随机'背后的状态机原理。很多孩子一看到 srand(0) 就下意识觉得'种子固定了,下次肯定还是这个数',或者反过来想'既然叫随机数,两次怎么可能一样'。这两种极端想法都忽略了关键点:rand 每次调用都会消耗掉当前的内部状态并产生新状态,只有在不重新调用 srand 的情况下,序列才会按预定顺序推进。
本题直击 GESP 二级《C++ 程序设计》中“随机数生成”这一高频考点。命题人想考的绝不仅仅是函数调用语法,而是伪随机数生成器(PRNG)的工作机理。
先要把概念捋直:C++ 中的 rand 和 srand 配合使用,其本质是一个确定性算法。srand 的作用不是“初始化”一次就万事大吉,而是重置生成器的内部种子状态;rand 每次被调用时,都会基于当前种子计算出一个新值,同时更新内部状态为下一个种子。这意味着,只要不中途再次调用 srand,连续调用 rand 得到的是一串按固定顺序排列的数,而非真正的“随机”。
这类题的陷阱往往藏在“直觉”里。命题人故意用 srand(0) 这个看似特殊的种子值,诱导考生产生两种错误联想: 1. 认为种子固定了,后续输出就会卡死在同一个值上(对应选项 A); 2. 认为既然是“随机数”,两次调用结果必然不同(对应选项 B 的反向思维)。
实际上,无论种子是 0 还是 1,只要中间没有再次调用 srand,rand 的内部状态都会按算法规定一步步推进。因此,连续两次 rand() 的结果一定不相等(除非算法本身有退化,但标准库实现不会这样)。
拿到此类题,先在脑海中构建一个“状态机”模型:
srand(0),状态机种子设为 0;rand():根据当前种子(0)算出值 V1,状态机内部状态更新为 S1;rand():根据 S1 算出值 V2,状态机内部状态更新为 S2;因为 V1 和 V2 分别来自不同的内部状态(S0 和 S1),所以 V1 ≠ V2。这个推导过程不需要具体知道算法公式,只要理解“状态随调用更新”这一核心逻辑即可。
学生最容易错选 A,理由是“种子没变,输出应该一样”。这完全误解了 srand 的语义——它只负责设定起点,不负责锁定终点。另一种错误是选 B 的反向(认为两次结果相等),这往往源于对“随机”一词的过度字面理解。
根据题库数据,C++ 程序设计模块共考过 261 题,其中 GESP 二级占 60 题,随机数相关题目在二级中属于必考内容。从逐年分布看,2023 年该模块考了 61 题,2024 年激增至 103 题,2025 年回落至 72 题,2026 年仅 13 题(可能为统计口径变化)。基础语法模块中,GESP 二级考了 283 题,随机数相关题目在历次考试中反复出现,说明命题人对此类概念理解非常看重。
预测:未来 1-2 年内,二级考试中仍会高频出现类似“srand 与 rand 连续调用结果”的判断题,命题人可能会换种子值(如 srand(1) 或 srand(100))或增加调用次数(连续三次、四次),但核心考点不变——考察考生是否真正理解伪随机数生成器的状态更新机制。暂无足够依据预测具体年份的考题形式,但建议考生重点掌握这一原理,而非死记硬背答案。