Wie acht-stellige Zufallszahlen generieren?



  • wie kann ich 8 stellige zufallszahlen generieren?

    cu

    <hume>Bitte bessere Topic-Titel verwenden!</hume>



  • man rand(3)



  • "hi" ist natürlich schonmal ein sehr guter Betreff. Also ebenfalls: "hi".



  • weiss ich jetzt nicht aus dem hut aber rand holt dir glaub ich ne 16 bit zufallszahl... wenn du es auf 32 erweitern willst einmal aufrufen um 16 bit shiften und nochmal aufrufen...



  • So wärs in C:

    #include <assert.h>
    #include <stdlib.h>
    #include <time.h>
    
    /* ... */
    
    assert(RAND_MAX >= 89999999);
    
    srand(time(0));
    int i = ((double) rand() / RAND_MAX) + 10000000;
    

    In C++ halt entsprechend mit cassert, cstdlib und ctime als header; außerdem ist der ganze Kram da im namespace std:

    #include <cassert>
    #include <cstdlib>
    #include <ctime>
    
    /* ... */
    
    std::assert(RAND_MAX >= 89999999);
    
    std::srand(time(0));
    int i = ((double) std::rand() / RAND_MAX) + 10000000;
    


  • Waaah. Gerade Denkfehler. Also:

    int i = ((double) rand() / RAND_MAX) * 8999999 + 10000000;
    


  • Windalf schrieb:

    weiss ich jetzt nicht aus dem hut aber rand holt dir glaub ich ne 16 bit zufallszahl... wenn du es auf 32 erweitern willst einmal aufrufen um 16 bit shiften und nochmal aufrufen...

    unter linux hats 31 bits, unter win oft 15 bits. 16 eher nie.
    was meint man mit 8 stellen (dezimalziffern)?

    gehe ich von 15 bit aus.
    die mit multiplikation auf 8 stellen aufzubalen ist fast unfug, es bleiben nur 2^15 verschiede zahlen und weden nicht 10^8 verschiedene zahlen.
    shiften und nochmal aufrufen war die gute lösung.
    außerdem garantiert auch nur das die gleichverteilung. beim multiplizieren und dividieren (wenn nicht zweierpotenz als faktor), wird alles leicht schief.
    2^30 ist gerade mal 1073741824. Das sind fast genau 9 ziffern. mit nur 7% müll. das würde für gleichverteilte zahlen reichen. oder macht einfach
    (rand()<<15+rand())/1073741824.0*100000000, was mir aber nicht zu höchster freude gereicht.



  • @volkard
    hmm also das mit dem shiften hab ich eher gemeint weil das relativ einfach ist aber ne gleichverteilung bekommt man damit doch imho nicht hin...

    angenommen ich würfel bei ersten mal ein 16.... dann werd ich beim zweiten wurf wohl keine 16 würfeln (so ich randmax verwende und keine moduloopertation nehme) an sonsten wäre die periode des zufies ja schon rum und der würde immer nur 16 würfeln...

    es gibt also jede menge zahlen die ich durchs shiften und wieder draufaddieren nicht hinbekommen werde weil ja nicht mehrmals die gleiche zahl hintereinander "gewürfelt" wird... in sofern ist das dann garantiert keien gleichverteilung mehr oder hab ich da was beim generieren von Pseudo-Random-Numbers falsch verstanden?


Anmelden zum Antworten