Rand() bringt mich noch um...



  • guten abend allerseits 😃

    so kurz und schmerzlos:
    ich habe irgendwas falsch gemacht,weswegen jetzt rand() nicht mehr funktioniert..

    srand(time(0));
    int summe = rand() % 20;
    

    Wenn ich das dann mit cout aufrufe,kommt ein seltsames Ergebnis bis zu 10 000 heraus 😕

    so schaut des voll aus:

    srand(time(0));
    int summe = rand() % 20;//20,17,1,14,..blabla
    cout<<summe;
    

    Ich hoffe,ihr könnt mir auf die Beine helfen *g* 🤡



  • Hallo

    kann ich mir nicht vorstellen, das bei genau diesem Code du 10000 als Ergebnis bekommst.

    bis bald
    akari



  • akari schrieb:

    Hallo

    kann ich mir nicht vorstellen, das bei genau diesem Code du 10000 als Ergebnis bekommst.

    bis bald
    akari

    versuch es bitte selbst,ich bekommen nähmlich 1010,1587,1000,...



  • Hallo

    einerseits bin ich mir dabei sehr sicher, andereseits hab ich auch wie erwartet beim Test dieses Codes nur Zahlen zwischen 0 und 19 bekommen

    #include <iostream>
    
    int main()
    {
      srand(time(0));
      for (int lv = 0; lv < 100; lv++)
      {
        int summe = rand() % 20;//20,17,1,14,..blabla
        std::cout<<summe << std::endl;
      }
    }
    

    bis bald
    akari



  • %20 heißt ja der Rest, wenn ich die Zahl durch 20 Teile, also können nur Zahlen zwischen 0 und 19 rauskommen 😉



  • Wieso gibts immer noch Leute dir im Bezug auf rand() mit Modulo arbeiten? Lasst das doch endlich mal...

    grüß



  • David_pb schrieb:

    Wieso gibts immer noch Leute dir im Bezug auf rand() mit Modulo arbeiten? Lasst das doch endlich mal...

    grüß

    Wieso nicht?



  • Weil du mit Modulo die "Breite" der möglichen Zufallszahlen von 0..RAND_MAX auf 0..RANGE begrenzt.

    grüße



  • Ehrlich?

    Was denkst du denn, ist sonst der Zweck?

    Primer hatte in einem anderen Thread gefragt, wie man die Zufallszahlen begrenzt, daher schreibt er hier 'rand() % 20'.

    Ich kenne eigentlich so gut wie keine Anwendung, in der die volle Breite von Zufallszahlen erwünscht ist. Man muss den Bereich immer abgrenzen.



  • DarthZiu schrieb:

    Ehrlich?

    Was denkst du denn, ist sonst der Zweck?

    Primer hatte in einem anderen Thread gefragt, wie man die Zufallszahlen begrenzt, daher schreibt er hier 'rand() % 20'.

    Ich kenne eigentlich so gut wie keine Anwendung, in der die volle Breite von Zufallszahlen erwünscht ist. Man muss den Bereich immer abgrenzen.

    Du verstehst das immer noch nicht oder?

    man rand() schrieb:

    "If you want to generate a random integer between 1
    and 10, you should always do it by using high-order
    bits, as in

    j=1+(int) (10.0*rand()/(RAND_MAX+1.0));

    and never by anything resembling

    j=1+(rand() % 10);

    (which uses lower-order bits)."

    Und hier:
    http://www.azillionmonkeys.com/qed/random.html
    http://mandrill.fuxx0r.net/c++/faq:no_rand_modulo

    Und unzählige weitere Links die per Google gefunden werden können.

    Im Klartext. Mit Modulo wird die wahrscheinlichkeit vergrößert das Zahlen aus einem bestimmen Bereich öfter auftreten. Und das ist tatsächlich nicht Sinn von Zufallszahlen.

    grüße



  • David_pb schrieb:

    http://mandrill.fuxx0r.net/c++/faq:no_rand_modulo

    Okay, ehrlich gesagt kannte ich das noch nicht und lass es für eine hohe obere Schranke des Intervalls gelten.

    Aber für Zufallszahlen in einem Bereich wie [0,20] kann man nach dem Beispiel oben genauso gut die Variante "rand()%OBERE_GRENZE-1" benutzen:

    Denn (wir nehmen mal wie im Beispiel RAND_MAX als 32767) und unser Intervall [0,20]:

    32767 / 20 = 1638 Rest 7
    
    Heißt also, dass nur bei den letzten 7 von 32767 möglichen Zufallszahlen das Intervall von [0,7] öfters auftreten würde, was ein Wahrscheinlichkeitsverhältnis von 
    
    1/1638 zu 1/1639 
    
    entspricht.
    

    Wenn ich mich nicht verrechnet habe 😉

    Aber ist auf jeden Fall interessant zu wissen. Wieder was gelernt 👍


Anmelden zum Antworten