rand() spuckt immer 41 aus...



  • Hallo Leute!

    Also ich bin Java-Programmierer (und jetzt nicht sagen: "Dann bleib doch bei deinem Schrott!!!" :D) und habe im September einen C/C++-Blockkurs von 11 Tagen . Fleißig wie ich bin, wollt ich mich in C einarbeiten. Mein Lottoprogramm, dass in Java fix und fertig auf 2 min. geschrieben ist, wollte ich in C umschreiben um Unterschiede festzustellen, doch leider hab ich ein Prob mit der rand()-Methode in C. Sie spuckt mir immer die Zahl 41 aus, egal was ich tue. 😃

    Ein einfacheres Beispiel, wo auch 41 rauskommt....^^

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
        int superzahl = rand() % 1000;
        printf("%d", superzahl);
        getchar();
        return 0;
    }
    

    Was mach ich da falsch, dass da immer 41 rauskommt? (Ich hätte gerne eine Zahl zwischen 0 und 9 wie (int)(Math.random()*9);).
    Meine nächste Frage: Muss ich die getchar()-Methode immer mitschleppen, damit die DOS-Konsole nicht geschlossen wird?

    Danke.

    Ringo_Starr



  • Ringo_Starr schrieb:

    Hallo Leute!

    Also ich bin Java-Programmierer (und jetzt nicht sagen: "Dann bleib doch bei deinem Schrott!!!" :D) und habe im September einen C/C++-Blockkurs von 11 Tagen . Fleißig wie ich bin, wollt ich mich in C einarbeiten. Mein Lottoprogramm, dass in Java fix und fertig auf 2 min. geschrieben ist, wollte ich in C umschreiben um Unterschiede festzustellen, doch leider hab ich ein Prob mit der rand()-Methode in C. Sie spuckt mir immer die Zahl 41 aus, egal was ich tue. 😃

    Ein einfacheres Beispiel, wo auch 41 rauskommt....^^

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
        int superzahl = rand() % 1000;
        printf("%d", superzahl);
        getchar();
        return 0;
    }
    

    Was mach ich da falsch, dass da immer 41 rauskommt? (Ich hätte gerne eine Zahl zwischen 0 und 9 wie (int)(Math.random()*9);).
    Meine nächste Frage: Muss ich die getchar()-Methode immer mitschleppen, damit die DOS-Konsole nicht geschlossen wird?

    Danke.

    Ringo_Starr

    Es ist keine echte zufalls zahl. es ist ein algorithmus, der immer das selbe ausspuckt^^



  • Dann bitte helfen, wie es denn richtig geht. 😃

    Aus dem Bauch raus würde ich ja : int a = (int)(Math.random()*10); machen 😃

    Ringo_Starr



  • Ringo_Starr schrieb:

    Aus dem Bauch raus würde ich ja : *int a = (int)(Math.random()10); machen.

    War doch schon mal nicht schlecht :

    ...
     randomize();            // <- vorher initialisieren !
     int a = rand () & 10;
    ...
    

    🙂



  • Du musst vorher man: srand(3) aufrufen, um den Algorithmus mit einem seed zu initialisieren. (wenn du gerade von C++ sprichst, im TR1 gibt es einige praktische Zufallszahlen-Klassen. Vielleicht solltest du dir die mal anschauen...)

    @merker
    ne, randomize gibt es nicht.





  • rüdiger schrieb:

    @merker
    ne, randomize gibt es nicht.

    War ein Schnellschuss. Sorry.
    Werde mich bei Gelegenheit mal wieder mit unseren Vorgaben beschäftigen :

    PORTABILITY
    
               randomize    srand 
    
    DOS            X          X
    UNIX                      X
    WIN16          X          X
    WIN32          X          X
    ANSI C                    X        <- :-(
    ANSI C++       X          X
    OS/2                      X
    

    🙂



  • Ringo_Starr schrieb:

    rand() spuckt immer 41 aus

    Sollte das nicht 42 sein? *scnr*

    @merker
    Woher stammt denn die Tabelle? randomize gibt es in C++ zB auch nicht.



  • die Zufallszahlen sollten mit

    srand(time(0));
    

    initialisiert werden.

    Wenn immer mit der selben Zahl initialisiert wird, kommt auch immer das selbe raus(logisch).
    time(0) liefert den momentanen Zeitstempel und so wird nie der selbe Wert initialisiert



  • #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <time.h>
    
    int main()
    {
        srand(time(0));
        int superzahl = rand() % 1000;
        printf("%d", superzahl);
        getchar();
        return 0;
    }
    

    ... theoretisch...



  • Ein Computer kann sich ja keine Zahl einfach so "ausdenken", sondern braucht einen Wert, an dem er sich orientieren kann. Wie hier eben die Zeit 🙂



  • chille07 schrieb:

    die Zufallszahlen sollten mit

    srand(time(0));
    

    initialisiert werden.

    Wenn immer mit der selben Zahl initialisiert wird, kommt auch immer das selbe raus(logisch).
    time(0) liefert den momentanen Zeitstempel und so wird nie der selbe Wert initialisiert

    Ne, time ist nicht gut. Der Seed sollte möglichst zufällig sein, damit man gute Zufallszahlen bekommt. Also sollte man zB /dev/random oder /dev/urandom dafür hernehmen. Unter BSD/OSX/Linux gibt es extra sranddev oä dafür.



  • Kann ein C-Profi einem Java-Programmierer nicht einen C-Code hinklatschern. Ist das so schwer verlangt? 😃 Nicht für C++, sondern nur für C, wenn es derselbe is, Pardon.

    int a = (int)(Math.random() * x) + y;

    Für Superzahl zwischen 0 und 9: --> x = 10; y = 0;
    Für eine Zahl wischen 1 und 49: --> x = 49; < = 1;

    So einfach gehts unter Java.

    Einfach nur den Code hinschreiben... für C...

    Ringo_Starr



  • Ringo_Starr schrieb:

    Kann ein C-Profi einem Java-Programmierer nicht einen C-Code hinklatschern. Ist das so schwer verlangt? 😃 Nicht für C++, sondern nur für C, wenn es derselbe is, Pardon.

    Tuts auch ein hinflatschern, hm ?
    Die Cplusplusler würden dir vielleicht ne virtuelle-random-funktor-template-klasse schreiben, aber
    wenn du es richtig machen willst, dann siehe weiter unten.
    Und ja, es ist 'schwer verlangt', wenn es das nicht wäre, könntest du es selbst oder ? 😃 *scnr*

    flatsch:
    srand((unsigned int)time(NULL));
    int irand( int von, int bis )
    {
    double r = bis - von + 1;
    return von + (int)(r * rand()/(RAND_MAX+1.0));
    }



  • Werde den Code daheim mal testen, im Moment gehts gerade nicht, meine Freundin hat was gegen Programmieren 😃

    Mal ne Frage zu der getchar()-Methode: Muss ich die immer mitschleppen, damit mir meine Konsole nicht geschlossen wird??
    Oh mann, ich komm mir vor wie ein blutiger Anfänger und ich dachte der Umstieg von Java auf C sei ein Kinderspiel.... ;):(:D

    Ringo_Starr



  • bei mir kann ich das einstellen, rechtsklick und eigenschaften, haken raus bei automatisch schliessen 😉


Anmelden zum Antworten