关于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
相关产品推荐
相关产品推荐

