当我在srand(time(NULL))
函数中使用rollDice()
时,它无效。但是当我把它放在主要部分时,它可以工作。这是为什么?
你能告诉我逻辑吗?
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
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;
}
答案 0 :(得分:8)
假设您拥有数百万本随机数字行的书籍。 在获得随机数之前,您需要选择一本书。
有了一本书后,要获得随机数,请从书中依次读取数字。 改变这本书会得到另一个随机数序列。
srand()
选择一本书并从头开始随机数字
rand()
从所选书籍中读取下一个数字
如果你把srand()
放在循环中,你实际上是从同一本书的开头重新启动随机数序列。
解决方案:选择一本书一次,并始终从中读取数字。
在C程序中,如果你没有“选择一本书”,那么随机数就来自书#1 ,换句话说,就没有{{ 1}}调用,函数srand()
的行为就像调用rand()
一样。
答案 1 :(得分:4)
当你在rollDice
函数中进行播种然后你在一个循环中调用这个函数时,不仅你的播种频率超过了你应该播种的频率,而且你的播种速度很快你就播种了具有相同的值(同一时间),在rand()
中产生相同的值:
srand()
函数将其参数设置为rand()
返回的新伪随机整数序列的种子。这些序列可通过调用srand()
来重复相同的种子价值。
经验法则: 种子只有一次。
值得看看以前解决这个问题的问题:
srand(time(NULL)) doesn't change seed value quick enough
Always repeated numbers given by rand()
srand function is returning same values等。
答案 2 :(得分:1)
问题在于srand()函数正在播种随机数生成器,并且您将使用当前时间播种它,该时间具有1秒的分辨率。因此,当您从rollDICE()函数内部调用srand()时,您会在同一秒内发生的每次调用中从rand()获得完全相同的结果。当第二个滴答时,你会得到与rand()不同的结果。
在main中调用srand()意味着在开始滚动之前只调用一次,然后rand()将返回一系列随机数。