2013-01-24 257 views
0

嘿,大家看看这个程序。srand函数返回相同的值

/* The craps game, KN king page 218 */ 

#include <stdio.h> 
#include <time.h> 
#include <stdbool.h> 
#include <stdlib.h> 

int roll_dice(void); 
bool play_game(void); 

int roll_dice(void) 
{ 
    int roll; 

    getchar(); 
    srand((unsigned) time(NULL)); 

    roll = rand() % 13; 

    if(roll == 0) 
    roll = roll + 1; 

    return roll; 
} 

bool play_game() 
{ 
    int sum = 0, wins = 0, loss = 0, point; 

    sum = roll_dice(); 

    printf("You rolled: %d", sum); 

    if(sum == 7 || sum == 11) 
    { 
     printf("\nYou won!\n"); 
     return true; 
    } 

    if(sum == 2 || sum == 3 || sum == 12) 
    { 
     printf("\nYou lost!!"); 
     return false; 
    } 

    point = sum; 

    printf("\n\nYour point is: %d", point); 

    do 
    { 
     sum = roll_dice(); 
     printf("\nYou rolled: %d", sum); 

    }while(sum != point); 

    if(sum == point) 
    { 
     printf("\nYou won!!!"); 
     return true; 
    } 

} 

int main() 
{ 
    char c, wins = 0, losses = 0; 
    bool check; 

    do 
    { 
     check = play_game(); 

     if(check == true) 
      wins++; 

     else if(check == false) 
      losses++; 

     printf("\nPlay Again? "); 
     scanf("%c", &c); 

    }while(c == 'Y' || c == 'y'); 

    printf("\nWins: %d  Losses: %d", wins, losses); 

    return 0; 
} 

srand函数不断返回,相同的值3或4次,y是那个吗?

我每次当我掷骰子时需要不同的值,复制代码并运行它,看看我的意思

+1

我不知道这对你的家庭作业是否重要,但即使解决了问题后,请记住'roll = rand()%13;'将返回0和12包括在内。如果你应该模拟两个六面骰子,那么0或1的卷不好。而修正这个表达式导致2到12的值也可能不够好,因为来自两个骰子的结果具有不均匀的分布。 –

+0

@MichaelBurr:对。它应该是'(rand()%6)+(rand()%6)+ 2;'。 –

+0

@MichaelBurr一个很好的解决方案是只需调用(rand()%6 + 1)两次,然后添加那些实际上可以模拟双骰子滚动 – RoneRackal

回答

8

srand()函数是设定种子的rand()函数的函数。你在这里做的是在你调用每个rand()之前将当前时间设置为当前时间,如果调用的足够快,它会得到相同的值(因为它将重置为相同的种子,如果足够快,同一时间值)。

你会想要做的是调用函数srand()一次,在程序启动时(在你的main()函数的开始)

然后调用rand()你想有一个随机数每一次,就像你现在正在做的一样,但是不要每次都调用srand()。

+0

我同意,我得到了正确的输出。非常感谢。我想早些时候说,但我的互联网连接搞砸了。 – user1971996

+0

@ user1971996没问题:D – RoneRackal