You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于srand(time(0))的疑问:循环内生成重复随机数问题

关于高低游戏中srand(time(0))放入循环导致随机数重复的问题

嗨,这个问题我之前也碰到过,其实核心原因和srand()的工作原理以及time(0)的返回值有关,我来给你掰扯清楚:

为什么会出现重复的随机数?

  • srand()的作用:它是用来给C++的随机数生成器设置种子的,同一个种子会让rand()生成完全相同的随机数序列。比如你两次用123作为种子调用srand(),之后调用rand()得到的数值顺序会完全一样。
  • time(0)的局限:它返回的是从UNIX纪元到当前时间的秒数。如果你的do-while循环迭代速度非常快(比如用户输入响应快,或者循环内逻辑执行时间不到1秒),那么每次循环里调用time(0)得到的都是同一个秒数,相当于每次都用同一个种子重新初始化随机数生成器,那rand()自然会输出序列里的第一个相同数值。

正确的解决方法

你只需要把srand(time(0))移到main()函数的开头,只调用一次就可以了。这样整个程序运行期间随机数生成器只会被初始化一次,每次调用rand()都会生成序列里的下一个随机数,就不会出现重复的问题了。

修正后的代码示例

#include<iostream>
#include<cstdlib>
#include<ctime>
int main(){ 
    int c; 
    // 只初始化一次随机数种子,放在程序开头
    srand(time(0)); 
    do{ 
        int i, num; 
        int min = 1; 
        int max = 10; 
        float fraction = 1.0 / (RAND_MAX + 1); 
        // 补全你截断的随机数生成逻辑
        num = min + (max - min + 1) * (rand() * fraction); 
        
        // 这里可以添加你的游戏逻辑,比如让用户猜测数字等
        std::cout << "生成的随机数是:" << num << std::endl;
        
        std::cout << "是否继续?(输入1继续,其他退出):";
        std::cin >> c;
    } while(c == 1); 
    return 0;
}

内容的提问来源于stack exchange,提问作者mirror06

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:08:55