调用函数srand时出现的问题(时间(NULL))rollDice函数中(Problems when

2019-07-22 15:57发布

当我第一次使用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;
}

Answer 1:

比方说,你有几百万的书籍在随机数排又一排。 在你得到一个随机数,你需要选择一本书。

你有一本书,获得的随机数之后,从书中读出顺序号。 更改书中得到随机数的另一序列。

srand()选择一本书,并从一开始就开始随机数
rand()读出从所选择的书的下一个数字

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

解决办法:选择1个书一次,并从它继续阅读数字直到永永远远。

在C程序中,如果你没有“选择书”,随机数来自书#1,或者换句话说, 在没有的srand()调用,函数rand()的行为如同srand(1)被调用。



Answer 2:

当你做内播种rollDice功能,然后你调用一个循环这个功能,不仅如此,你的往往比你应该无欲无求,但循环是如此之快,你用相同的值播种(同时),其产生在rand()返回同一值:

srand()函数设置它的参数作为伪随机整数的新序列的种子由被返回rand()这些序列是通过调用重复srand()具有相同的种子值。

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

值得看看解决这个问题前面的问题:
函数srand(时间(NULL))不会改变种子值够快
总是反复兰德公司提供的数字()
srand函数将返回相同的值等



Answer 3:

问题是,该函数srand()函数播种随机数生成器,你就与当前时间,其中有1秒的分辨率播种了。 所以,当你调用srand()函数从rollDICE()函数中,你从上发生的每一个相同的第二呼叫兰特()完全相同的结果。 当第二蜱,你会得到从兰特不同的结果()。

调用srand()函数里面,你只叫一次,你开始轧制前,然后兰特主要手段()将返回一个随机数序列。



文章来源: Problems when calling srand(time(NULL)) inside rollDice function
标签: c random srand