【问题标题】:Problems when calling srand(time(NULL)) inside rollDice function在 rollDice 函数中调用 srand(time(NULL)) 时出现问题
【发布时间】:2013-03-22 12:51:19
【问题描述】:

当我第一次在rollDice() 函数中使用srand(time(NULL)) 时,它不起作用。但是当我把它放在 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;
}

【问题讨论】:

  • “不工作”是什么意思?
  • 你的问题是很多,许多人在第一次尝试使用随机数接口时遇到的,并且一直是asked over and over again on Stack Overflow(搜索不都是重复的,但是其中近一半是)。
  • 一开始我将 srand 放入 rollDice 时,它​​每次都返回 7,但是当我将它放在 main 下时,它给了我预期的不同结果。
  • 在用户开始准确猜测结果之前滚动多少次? ;)

标签: c random srand


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • srand(time(NULL)) 将选择图书#1363958819 如果现在发行:)
【解决方案2】:

当您在 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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 但是如果它在我放入 main 时运行一次,为什么它会给出不同的结果?我认为因为它被称为主要的,它必须一遍又一遍地给出相同的。当我把它放在 rollDice 里面时,因为 rollDice 在不同的时间被调用,它必须给出不同的数字。但情况不是这样的。???
    • srand() “种子”随机数生成器。即...它设置了 rand() 稍后将返回给您的伪随机数字序列。如果您使用相同的数字多次为随机数生成器播种,那么您将始终从 rand() 获得相同的结果。如果您在 rollDice() 内部调用 srand() 并传入当前时间,那么您每次都以完全相同的值“重新启动”随机数生成器,直到时间改变(秒针滴答作响)。当您在 main 中调用 srand() 时,您只需为生成器播种一次,之后对 rand() 的每次调用都会返回一个新结果。
    • 非常感谢您的解释
    猜你喜欢
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 2014-11-03
    • 2020-07-25
    • 2017-07-17
    • 2014-05-31
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多