3

当我第一次 srand(time(NULL))rollDice()功能中使用它时它不起作用。但是当我把它放在 main 中时,它可以工作。这是为什么?你能告诉我其中的逻辑吗?

#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;
}
4

3 回答 3

9

假设您有数百万本书,其中包含一排排随机数。在获得随机数之前,您需要选择一本书。

拿到书后,要获得随机数,请从书中顺序读取数字。换书会得到另一个随机数序列。
更改为同一本书会从书中的第一个数字重新开始序列。

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

如果你放入srand()循环中,你实际上是从同一本书的开头重新开始随机数序列。

解决方案:选择一本书一次,并一直阅读其中的数字。

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

于 2013-03-22T13:10:28.163 回答
5

当您在rollDice函数内进行播种然后在循环中调用此函数时,不仅您播种的频率比您应该做的要多,而且循环速度如此之快,以至于您使用相同的值(相同时间)播种这会rand()返回相同的值:

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

经验法则:只播种一次。

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

于 2013-03-22T12:54:06.057 回答
1

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

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

于 2013-03-22T12:55:39.497 回答