2016-07-06 10 views
0

Ich habe C vor kurzem gestartet und habe Probleme, den Computer an eine Zufallszahl denken zu lassen. Dies ist der Code bisher. Ich brauche Hilfe!Zufallszahlengenerator Spiel in 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 viele Leute, es hat geklappt !!!!

+2

Sie rufen nicht 'srand' Funktion auf. Enthalte 'time.h' und rufe' srand (time (NULL)); 'nach der Deklaration der Variablen. – Misaz

+2

Missing '&' beim Lesen: 'scanf ("% d ", & userin);' statt 'scanf ("% d ", userin);' –

+0

Interessant, dass der Code die Zufallszahl nach der Benutzereingabe generiert. Natürlich ist die Reihenfolge nicht so wichtig - es scheint nur so, als ob der Code mit dem Wissen der Benutzereingabe betrügt. Könnte einfach 'puts (" Vermute eine Zahl von 1 bis 10 "); scanf ("*% s"); puts (rand()% 10 == 0? "Sie haben Recht": "Bitte versuchen Sie es erneut"); 'Wird ein Vergleich mit den richtigen Benutzereingaben wirklich benötigt? User gewinnt in jedem Fall 1/10 der Zeit. – chux

Antwort

0

Probleme:

scanf("%d", userin); //you are sending variable 
  • Das ist nicht richtig, wie Sie Adresse des variable als Argument an die scanf() nicht die variable

so anstatt sie senden müssen ändern zu:

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

und rand()%11 würde eine beliebige Anzahl 0-10 produzieren, aber nicht 1-10

als andere Antwort schon sagt, Verwendung:

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

Lösung:

Und auch enthalten time.h Funktion 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; 
} 

Warum srand(time(NULL)) zu benutzen?

  • rand() ist überhaupt nicht zufällig, es ist nur eine Funktion, die eine Folge von Zahlen erzeugt, die oberflächlich zufällig sind und wiederholen sich über einen Zeitraum.

  • Die einzige Sache, die Sie ändern können, ist der Startwert, der Ihre Startposition in der Reihenfolge ändert.

und srand(time(NULL)) wird aus diesem Grund verwendet

+0

Suggest umformulieren "und rand()% 11 würde jede Zahl von 0 bis 10 aber nicht aber nicht von 0 bis 10" – chux

+0

@chux ich habe es übersehen, danke! – Cherubim

+0

@everyone thx viel ich habe es funktioniert cus von euch Jungs! –

5

in Ihrem Code r wird dies eine Zufallszahl von 0 bis 10. Für eine Zufallszahl zwischen 1 und 10, tun sein:

int r = rand() % 10 + 1; 

Außerdem sollten Sie

nennen
srand(time(NULL)); 

am Anfang von main den Zufallszahlengenerator zu seed. Wenn Sie den Generator nicht erzeugen, wird immer die gleiche Sequenz generiert.

2

Es gibt Problem in Ihrer scanf Aussage auch.

sollten Sie

scanf("%d", &userin); 

statt, an dem

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

scanf muss die Adresse von Variablen verwenden, wird der Wert gespeichert werden. Für eine Variable ist dies gegeben, indem die Variable mit & vorgesetzt wird, wie in &userin.

2

Es gibt einige Probleme in Ihrem Code.

  1. nicht in die Adress Lesen & Ihrer variablen scanf
  2. ohne Berücksichtigung von „legitimen“ Werte der Eingabe, Ergebnis rand()%11 auch mit 0 sein kann
  3. nicht Überprüfung gegen „illegale“ Eingabewerte, die können "Alias" das Ergebnis.
  4. nicht richtig initialisieren Seed der Pseudozufallsfunktion rand(), so dass es immer das gleiche Ergebnis zurückgibt.

Mit printf für Ihren Code debuggen, wie im folgenden Beispiel, basierend auf Ihren Code kann viel helfen:

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

bitte auch this SO post konsultieren.

+0

Überprüfen Sie den Rückgabewert von 'scanf()' ist auch eine gute Idee. – chux

+0

Danke für deinen Vorschlag, @chux, wirklich eine gute Programmiergewohnheit: man sollte 'scanf()' return value nicht ignorieren. (-: – 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; 
    } 

bearbeiten arbeiten Dies sollte: Sie möchten Code implementieren, um sicherzustellen, dass die Benutzereingabe in der Tat eine ganze Zahl ist.