Nicht gleichverteilte Zufallszahlen



  • Hallo,

    rand()/INT_MAX liefert ja eine Gleichverteilung, wobei jede Zahl in [0,1] ist. Also z.B. ist 0.3 genauso wahrscheinlich wie 0.9. Ich brauche jetzt aber eine nicht-gleichverteilung: Umso groesser der Wert ist, desto seltener soll er erzeugt werden. Also kleine Werte wie 0.2, 0.3 etc soll er haeufig erzeugen und 0.8 dann schon seltener. Ein Wert wie 0.999 soll quasi extrem unwahrscheinlich sein.
    Wie kann ich sowas mit C++ machen?



  • rand() ist nicht gleich verteilt, ganz im Gegenteil sind dort kleinere Werte leicht wahrscheinlicher. Du suchst aber eine andere Lösung um das Verhalten geziehlt zu steuern.



  • Zwei oder mehrere Zufallszahlen zischen 0 und 1 multiplizieren?


  • Mod

    HighLigerBiMBam schrieb:

    rand() ist nicht gleich verteilt, ganz im Gegenteil sind dort kleinere Werte leicht wahrscheinlicher.

    Wie kommst du darauf?

    @Threadersteller: Werde konkret, welche Verteilung du meinst (als normierte Funktion auf dem gewünschten Intervall) und man kann dir eine konkrete Lösung nennen. Ansonsten bleibt nur der Hinweis auf ein Numerikbuch deiner Wahl.
    Oder wenn dir die konkrete Form egal ist, nimm das was Vicious Falcon vorgeschlagen hat.



  • SeppJ schrieb:

    HighLigerBiMBam schrieb:

    rand() ist nicht gleich verteilt, ganz im Gegenteil sind dort kleinere Werte leicht wahrscheinlicher.

    Wie kommst du darauf?

    Habe ich mal in der C++ Referenz gelesen. Wenns nicht stimmt dann habe ich halt unrecht, aber ich zitiere es:

    Notice though that this modulo operation does not generate a truly uniformly distributed random number in the span (since in most cases lower numbers are slightly more likely), but it is generally a good approximation for short spans.



  • Das bezieht sich nicht auf rand() selbst, sondern darauf wie man gerne den Wertebereich von rand() eingrenzt, eben mit dem % Op.

    Desweiteren sind Aussagen wir rand() ist nicht dies und rand() ist nicht das unerheblich, weil das immer implementierungsabhängig ist.



  • Schau dir mal den neuen <random> an, falls dein Compiler den schon mitbringt (alternativ in boost zu haben). Da kannst du verschiedene Verteilungen auswählen, z.B. normal_distribution die eine Normalverteilung generiert.



  • Die Idee mit dem mulen mehrere Werte in [0,1] find ich schon mal sehr gut!

    SeppJ schrieb:

    @Threadersteller: Werde konkret, welche Verteilung du meinst (als normierte Funktion auf dem gewünschten Intervall) und man kann dir eine konkrete Lösung nennen. Ansonsten bleibt nur der Hinweis auf ein Numerikbuch deiner Wahl.
    Oder wenn dir die konkrete Form egal ist, nimm das was Vicious Falcon vorgeschlagen hat.

    Das Problem ist, dass ich nicht wirklich weiss, was es da so gibt (war nie gut in so Verteilungszeug). Wie heissen denn Funktionen, die in Frage kaemen (braeuchte sinnvolle Schlagwoerter, damit ich googeln kann)


  • Mod

    HighLigerBiMBam schrieb:

    Habe ich mal in der C++ Referenz gelesen. Wenns nicht stimmt dann habe ich halt unrecht, aber ich zitiere es:

    Notice though that this modulo operation does not generate a truly uniformly distributed random number in the span (since in most cases lower numbers are slightly more likely), but it is generally a good approximation for short spans.

    Das was Tim sagt. Und noch die Feststellung, dass für Wertebereich << RAND_MAX der Fehler extrem klein ist (und dies ist der übliche Fall).


  • Mod

    GleichheitFuerAlle schrieb:

    Das Problem ist, dass ich nicht wirklich weiss, was es da so gibt (war nie gut in so Verteilungszeug). Wie heissen denn Funktionen, die in Frage kaemen (braeuchte sinnvolle Schlagwoerter, damit ich googeln kann)

    http://de.wikipedia.org/wiki/Liste_univariater_Wahrscheinlichkeitsverteilungen

    Aber wenn die Details egal sind, ist eine Multiplikation mehrerer Zahlen (oder immer der gleichen Zahl!) eine sehr gute Möglichkeit.



  • Hiermit kann jede beliebige Verteilung realisieren.
    http://de.wikipedia.org/wiki/Verwerfungsmethode


Anmelden zum Antworten