2016-07-06 74 views
0

我最近開始使用C,並且遇到麻煩使計算機想到一個隨機數。 這是迄今爲止的代碼。我需要幫助!C中的隨機數生成器遊戲

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    time_t t; 
    int userin; 
    printf("Guess a number from 1 to 10\n"); 
    scanf("%d", userin); 
    int r = rand() % 11; 

    if (r == userin) 
    { 
     printf ("you are right"); 
    } 
    else 
    { 
     printf("Try again"); 
    } 
    return 0; 
} 

Thx很多傢伙它解決了!

+2

你不調用'srand'函數。在變量聲明後包含'time.h'並調用'srand(time(NULL));'。 – Misaz

+2

在閱讀時缺少'&':'scanf(「%d」,&userin);'而不是'scanf(「%d」,userin);' –

+0

有趣的是,代碼在用戶輸入後生成隨機數。當然,順序並不那麼重要 - 它只是看起來代碼是先知道用戶輸入而作弊。可以簡單地編碼'puts(「猜測一個數字從1到10」);的scanf( 「*%S」); puts(rand()%10 == 0?「你是對的」:「再試一次」);'是否需要比較正確的用戶輸入?在任何一種情況下,用戶都能贏得1/10的時間。 – chux

回答

0

問題:

scanf("%d", userin); //you are sending variable 
  • 這是不對的,因爲你需要爲參數的variable的發送地址scanf()不是variable

所以不是改變它到:

scanf("%d", &userin); //ypu need to send the address instead 

rand()%11會產生任何數量從010但不能從110

其他答案表明,使用:

(rand()%10)+1 //to produce number from 1 to 10 

解決方案:

而且還包括time.h功能使用srand(time(NULL));

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

int main(void) 
{ 
    srand(time(NULL)); 

    int userin; 

    printf("Guess a number from 1 to 10\n"); 
    scanf("%d", &userin); 
    int r = (rand() % 10)+1; 

    if (r==userin) 
    { 
     printf ("you are right"); 
    } 
    else 
    { 
     printf("Try again"); 
    } 

    return 0; 
} 

爲什麼使用srand(time(NULL))

  • rand()不是隨機可言,它只是產生哪些是表面上隨機和重複自己在一段數字序列的功能。

  • 你可以改變的唯一的事情是種子,它會改變序列中的起始位置。

,並srand(time(NULL))用於這個原因

+0

建議重新措辭「和蘭德()%11將產生任何數字從0到10但不是但不是從0到10」 – chux

+0

@chux我忽視了它,謝謝! – Cherubim

+0

@everyone thx很多我得到它的工作你的傢伙! –

5

在你的代碼,r將從0的隨機數到10。1和10之間的隨機數,這樣做:

int r = rand() % 10 + 1; 

此外,你應該叫

srand(time(NULL)); 

main的開始處播種隨機數發生器。如果您沒有給發生器播種,它總會產生相同的序列。

2

您的scanf聲明中也存在問題。

您應該使用,而不是

scanf("%d", &userin); 

scanf("%d", userin); /* wrong - you need to use &userin */ 

scanf需要在哪些它將存儲值的變量的地址。對於變量,這由變量優先給出&給出,如&userin

2

有在代碼中的幾個問題。

  1. 沒有讀成使用地址的變量&scanf
  2. 不考慮輸入的「合法」的價值觀,rand()%11結果也可以0
  3. 沒有檢查,對「非法」的輸入值,它可「別名」的結果。
  4. 未正確初始化種子的僞隨機rand()函數,所以它總是返回相同的結果。

使用printf調試代碼,如下面的例子中,基於您的代碼可以幫助很多:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#define DEBG 1 

int main (void) 
{ 
    time_t t; 
    int userin; 
    printf("Guess a number from 1 to 10\n"); 
    if(scanf("%d", &userin) != 1){ // read into the variable's address 
     printf("Conversion failure or EOF\n"); 
     return 1; 
    } 

    if(userin < 1 || userin > 10){ // check against "illegal" input 
     printf("Offscale, try again\n"); 
     return 1; 
    } 

    srand(time(NULL));    // initialize the seed value 
    int r = 1 + rand() % 10;  // revise the formula 

    if (DEBG) printf("%d\t%d\t", r, userin); //debug print 

    if (r==userin){ 
     printf ("you are right\n"); 
    }else{ 
     printf("Try again\n"); 
    } 
    return 0; 
} 

請,也諮詢this SO post

+0

檢查'scanf()'的返回值也是一個好主意。 – chux

+0

感謝您的建議,@chux,真的是一個很好的編程習慣:不應該忽略'scanf()'返回值。 ( - : – user3078414

0

這應該工作

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

    int main() 
    { 
     int userIn = 0; //I like to initialize 
     printf("Guess a number from 1 to 10\n"); 
     scanf("%d", &userIn); 

     srand(time(NULL)); //seed your randum number with # of seconds since the Linux Epoch 

     int r = (rand()%10)+1; //rand%11 gives values 0-10 not 1-10. rand%10 gives 0-9, +1 makes sure it's 1-10 

     if (r == userIn) 
     { 
     printf ("you are right\n"); 
     } 
     else 
     { 
     printf("Try again\n"); 
     } 
     return 0; 
    } 

編輯:您可能要實現代碼以驗證用戶輸入實際上是一個整數。