如何让while循环中生成的随机数彼此独立?
如何让循环中的随机数结果更独立?
兄弟,你这是踩了随机数使用的经典坑啦!问题根源很明确:你在while循环里每次都调用srand((unsigned int)time(NULL))播种。
time(NULL)返回的是秒级时间戳,而你的循环执行速度远快于1秒,这就导致连续N次循环里,srand拿到的种子都是同一个值——同一个种子会让随机数生成器产出完全相同的序列,所以你才会看到一堆连续的"All ok"或者连续的"ERROR"。
修复方案:把播种操作移到循环外面,只执行一次!
随机数生成器只需要初始化一次,之后每次调用rand()都会生成序列里的下一个独立随机数,这样结果自然就有多样性了。
修正后的代码如下(顺便提一句:你原代码里的random()应该是笔误吧?C标准库的随机数函数是rand()):
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { // 只初始化一次随机数种子,放在循环启动前 srand((unsigned int) time(NULL)); while(1) { double chance = rand() / (double) RAND_MAX; if (chance <= 0.95) printf("All ok.\n"); else printf("ERROR\n"); } return 0; }
额外小提示
如果你的场景需要极高频率的随机数(比如每秒上万次调用),担心rand()的周期不够用,可以考虑更现代的随机数API:
- 类Unix系统可以用
arc4random()(不需要手动播种) - Windows系统可以用
rand_s()
不过对于你的需求来说,把srand()移到循环外已经完全能解决问题啦。
内容的提问来源于stack exchange,提问作者Robb1
相关产品推荐
相关产品推荐

