在rollDice函数内调用srand(time(NULL))时出现问题

当我在rollDice()函数中使用第一个srand(time(NULL))时它不起作用。 但是当我把它放在主要部分时,它可以工作。 这是为什么? 你能告诉我逻辑吗?

 #include  #include  #include  int rollDice(void) { return (1+rand()%6) + (1+rand()%6); } int main(void) { int roll; srand(time(NULL)); roll = rollDice(); printf("You rolled %d.\n", roll); enum Gamestatus {WON,LOST,CONTINUE}; enum Gamestatus status; while(status==CONTINUE){ printf("You are rolling again: \n"); printf("You rolled %d\n", roll = rollDice()); if (targetPoint==roll){ printf("You win!"); status=WON; } else if(7==roll){ printf("You lost!"); status=LOST; } else status=CONTINUE; } return 0; } 

假设您拥有数百万本随机数字行的书籍。 在获得随机数之前,您需要选择一本书。

拿到书后,要获得随机数,请从书中依次读取数字。 改变这本书会得到另一个随机数序列。

srand()选择一本书并从头开始随机数
rand()从所选书籍中读取下一个数字

如果将srand()放在循环中,则实际上是从同一本书的开头重新启动随机数序列。

解决方案:选择一本书一次,并始终从中读取数字。

在C程序中,如果你不“选择一本书”,随机数来自书#1 ,换句话说, 在没有srand()调用的情况下,函数rand()行为就像srand(1)被称为。

当你在rollDice函数中进行种子rollDice然后你在一个循环中调用这个函数时,不仅你比你应该更频繁地播种,而且循环是如此之快以至于你播种的是相同的值(同一时间) )在rand()返回相同的值:

srand()函数将其参数设置为rand()返回的新的伪随机整数序列的种子。通过使用相同的种子值调用srand() ,这些序列是可重复的。

经验法则: 种子只有一次。

值得看看以前解决这个问题的问题:
srand(time(NULL))不会足够快地更改种子值
总是由rand()给出的重复数字
srand函数返回相同的值等。

问题是srand()函数正在为随机数生成器播种,并且您将使用当前时间播种它,该时间具有1秒的分辨率。 因此,当您从rollDICE()函数内部调用srand()时,您会在同一秒内发生的每次调用中获得与rand()完全相同的结果。 当第二个滴答时,你会得到与rand()不同的结果。

在main中调用srand()意味着在开始滚动之前只调用一次,然后rand()将返回一系列随机数。