maximalwert von rand() unterschidlich bei 64bit?



  • hallo

    ich will rand() verwenden und habe das Problem das 32767 nicht das Maximum ist das rand() leifert.

    darauf gekommen bin ich daduurch das ich zahlen bis 80 benötige
    dazu Teile ich 32767 durch 409 und schreibe das in einen Integer daduch sollten die Kommastellen abgeschnitten werden.
    die Zahlen die meine funktion schmeißt sind aber viel größer.

    mit der 43421773 komme ich einigermaßen in den gewünschten größenbereich. ich bräuchte es aber genauer.

    ist der maximalwert der funktion rand() auf 64bit größer wenn ja wie lautet der genaue Wert?

    void enemiegenerator(char *screen){
        int i=0, j=0,randre=0;
        randre=(rand()/43421773);
        printf("%i",randre);
        for (i=0;i<=2;i++){
            for (j=0;j<=2;j++){
                *(screen+i*SPALTENZAHL+j)=randre;
            }
        }
    
    }
    




  • habe das Problem jetzt mit Modulo gelöst

    x=rand()%80;
    

    damit erhalte ich ausreichend zufällige zahlen zwischen Null und 80;

    Trotzdem interessiert es mich noch warum mein Ansatz nicht funktioniert.
    offenbar erzeugt meine rand()- Funktion Zahlen die größer sind als 32767.

    Grüße



  • Also wenn du 80 einschließen willst, musst du 81 nehmen.



  • das verstehe ich leider nicht ganz.
    warum muss ich um zahlen bis n zu bekommen mit x%(n+1) rechnen?

    und meine Frage steht immer noch ist rand() auf einem 64bit sys anders?bzw gibt es rand das einen Größeren Bereich aus? oder habe ich was falsch an meiner Rechnung? (Siehe code im ersten Post)



  • RajHid schrieb:

    das verstehe ich leider nicht ganz.
    warum muss ich um zahlen bis n zu bekommen mit x%(n+1) rechnen?

    Falls x,nNx,n \in \mathbb{N}, dann gilt per Definition, dass xmodn{0,1,2,,n1}x \; mod \; n \in \{ 0, 1, 2, \ldots, n - 1 \}
    Somit duerfte klar sein, warum du xmod(n+1)x \; mod \; (n+1) nehmen musst.

    RajHid schrieb:

    und meine Frage steht immer noch ist rand() auf einem 64bit sys anders?bzw gibt es rand das einen Größeren Bereich aus? oder habe ich was falsch an meiner Rechnung? (Siehe code im ersten Post)

    Ich zitiere aus C++ Reference - Rand:
    "RAND_MAX is a constant defined in <cstdlib>. Its default value may vary between implementations but it is granted to be at least 32767."

    Man kann also nicht davon ausgehen, dass auf einem 64bit System RAND\_MAX groesser ist als auf einem 32bit System. Man weiss bloss, dass RANDMAX32767RAND_MAX \geq 32767


  • Mod

    Wenn du mehr als Spielerei vor hast, ist ein Zufallsgenerator mit globalem Zustand und implementationsabhängigen Eigenschaften nicht das Wahre (für nicht-professionelle Anwendungen ist es aber bei weitem gut genug!). Dann empfiehlt es sich, eine eigene Implementierung eines bekannten Generators mit einem Zustandsobjekt zu schreiben. Oder eine der zahlreichen Bibliotheken dafür nutzen. Es gibt auch PRNGs des Betriebssystems und neuerdings sogar der CPU selbst, wenn das Zielsystem einigermaßen bekannt ist,


Anmelden zum Antworten