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

时间:2013-03-22 12:51:20

标签: c random srand

当我在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;
}

3 个答案:

答案 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()将返回一系列随机数。