zufalls integer



  • Ach was, ich benutze den Multiply-With-Carry-Generator, den du mir vor einiger Zeit empfohlen hast. Er scheint sich zu bewähren... Danke, volkard! 🙂


  • Mod

    volkard schrieb:

    brotbernd schrieb:

    Und ich rede jetzt hier nicht von der Qualität der Zahlen.

    Ich rede nur von der Qualität der Zahlen. Wie so oft wurde rand() wieder abgelehnt nur wegen der Qualität der Zahlen. Und hier bin ich eher des Skeptiker. Mir scheint, man erzählt sich immer wieder gegenseitig etwas und sowas wie eine kleine Religion entsteht um den Mersenne Twister. Daß der globale Zustand pöse ist, da sind wir einer Meinung.

    Der rand() ist aber schon etwas was schnell ins Auge gehen kann und es gibt keinen guten Grund, das zu riskieren. Wenn der Threadersteller sagt, dass er MC macht, dann kann das ziemlich vieles sein. Falls er so etwas macht wie ich (und ich mache gar nicht mal so anspruchsvolles Zeug), dann fliegt er gehörig auf die Schnauze mit rand(). Wie otze schon erwähnt hat, liefern LCG an sich schon schlechte Verteilungen wenn man Zahlenpaare zieht. Und wenn auf der Maschine ein klassischer 15 Bit LCG laufen sollte, dann ziehe ich in jedem Schritt schon mehr Zahlen als der seine Periode hat.
    Und man hat natürlich noch mehr Nachteile, den globalen Zustand hast du genannt, ein weiterer ist, dass die Zahlen nicht portierbar sind, da die Implementierung nicht vorgegeben ist. rand() ist was für Spielereien und schnelles testen, sobald man damit etwas macht wofür man Geld bekommt oder das man veröffentlichen möchte, ist er nur noch fahrlässig.



  • SeppJ schrieb:

    Und wenn auf der Maschine ein klassischer 15 Bit LCG laufen sollte,

    irrelevant

    SeppJ schrieb:

    ein weiterer ist, dass die Zahlen nicht portierbar sind, da die Implementierung nicht vorgegeben ist.

    Ungefähr das ist mein Grund gegen rand(). Und ein wenig Verspieltheit.



  • otze schrieb:

    ...

    Hey danke für dein beispiel, ich habe den fehler damit gefunden. Denke aber deine korrektur ist nicht das was ich tuen wollte ^^.
    Ich hätte den code wohl direkt erklären sollen hole das hiermit mal nach:
    nehme an RAND_MAX==8. dann generiert rand(); zahlen von 0 bis 8.
    Angenommen ich will nun zufallszahlen von min=0 bis max=5 dann ist nrofrandomnumbers=5-0+1=6.
    Eine erste annäherung für die lösung der aufgabe wäre min+rand()%6 = 0+rand()%6;.
    rand(); gibt 0%6=0, 1%6=1, 2%6=2, 3%6=3, 4%6=4, 5%6=5, 6%6=0, 7%6=1, 8%6=2.
    Damit es gleichverteilt ist will die letzten zahlen die zu oft vorkommen rausnehmen.
    Wenn ich floor((RAND_MAX+1)/nrofrandomnrs) nehmen würde wüsste ich wie oft jede zahl vorkommen dürfte. (RAND_MAX+1 ist nrofrandnrs mit min=0, max=RAND_MAX für alle rand(); ergebnisse).
    Das bringt mich allerdings nicht sofort zum ziel.
    Wenn ich hingegen b=(RAND_MAX+1)%nrofrandomnrs nehme kann ich herrausfinden wie viele zahlen zu oft vorkommen. z.b. kann ich die 6 zahlen die ich habe (0..6) in 0..8 nur einmal unterbringen wenn ich gleichverteilung will und der rest ist b=(8+1)%6=3. Also b zahlen wurden zu oft untergebracht.
    Meine fehler also korrigiert und verschönert 😃 :

    int getrand() {
                int nrofrandomnumbers, b;
                nrofrandomnumbers = max-min+1;
                b = (RAND_MAX+1)%nrofrandomnumbers;
                do {
                    randomnumber = rand();
                } while (randomnumber > RAND_MAX-b);
                return min+randomnumber%(max-min+1);
            }
    

    was meint ihr ist es nun korrekt?

    edit: ich lese btw auch eure anderen vorschläge. mir ist performance des zufallsalgorithmus schon ziemlich wichtig. Der trend geht also weg von rand() aus cstdlib so wie ich das mitbekomme? Werde mir demnächst mal alternativen anschauen.


Anmelden zum Antworten