Programm läuft nicht korrekt


  • Mod

    Ramanujan schrieb:

    rnd() liefert reelle Werte zwischen 0 und 1 (jeweils einschließlich). Die Wahrscheinlichkeit für den Wert für 0 ist 1/2^64 (wenn sizeof(long long) == 8 gilt). Da allerdings rnd() auch 1 als Ergebnis liefern kann, sind ganze Werte um 1/2^64 wahrscheinlicher. Wenn rnd() von 0 (einschließlich) bis 1 (ausschließlich) liefern würde, wäre aber alles ok. Da double ziemlich ungenau ist (im Vergleich zu long long), spielt das aber keine Rolle.

    Deine Argumentation ist nicht überzeugend, der Datentyp spielt keine Rolle. Aber wenn du nicht zur Kenntnis nehmen möchtest, wenn man dich auf Fehler hinweist, dann will ich dich auch nicht zu deinem Glück zwingen.



  • [Unsinn]
    ~~Freund Ramanujan...
    Wenn du mit zwei Würfeln würfelst, und das Ergebnis zusammenzählst, wie ist dann die Verteilung? Ist das dann gleichverteilt?

    Nein, ist es nicht. Genau so wenig wie die Werte in deinem Beispiel gleichverteilt sind.~~[/Unsinn]

    Davon abgesehen ist die Implementierung von random_LL furchtbar. Sie verlässt sich auf rand() , und da rand() meist ein ganz einfacher LCG ist, hagelt es nur so kurze Serien in den unteren Bits.
    Die Werte die random_LL produziert sind also voll von diversen statistischen Auffälligkeiten. Das selbe gilt dann natürlich auch für rnd() .

    Und wie diese "statistischen Auffälligkeiten" aussehen ändert sich natürlich auch, wenn du 1x mehr oder weniger random_LL aufrufst.



  • SeppJ schrieb:

    Ramanujan schrieb:

    @1.) Die Funktion useful::random_LL(-50, 49) gibt mir ganze Zahlen von -50 bis 49. useful::rnd(0,1) addiert Werte zwischen 0 und 1 hinzu. Somit ergibt sich eine Gleichverteilung von -50 bis 50.

    Nein. Wie schon gesagt, ist die Summe von zwei Gleichverteilungen keine Gleichverteilung.

    In diesem Fall schon.

    hustbaer schrieb:

    Wenn du mit zwei Würfeln würfelst, und das Ergebnis zusammenzählst, wie ist dann die Verteilung? Ist das dann gleichverteilt?

    Du bringst ein gutes Beispiel. Der Trick beruht ja darauf, dass sich z.B. 7 auf mehrere Arten schreiben lässt und diese nachher nicht mehr unterscheidbar sind.

    Bei Rammi ist es aber anders. Er hat irgendeine Ganzzahl. Und er addiert eine Kommazahl zwischen 0 und 1 (ich hoffe mal, exklusive 1) hinzu. Vor- und Nachkommastellen quasi.

    Wenn du die Zahl 14.62341 bekommst, gibt es genau 1 Möglichkeit für die Ganzzahl und genauso nur 1 für die Kommazahl. Jede erhaltene Zahl lässt sich so eindeutig zerlegen.

    Folglich ist das hier ein Spezialfall, in dem die Summe zweier Gleichverteilungen gleichverteilt ist.



  • *self-facepalm*

    Ja, haste recht. 😮 Sorry.
    Der Rest meines Beitrags ist trotzdem nicht ganz verkehrt 🙂

    Danke für die sehr sachliche und freundliche Korrektur! 🙂

    distributor schrieb:

    addiert eine Kommazahl zwischen 0 und 1 (ich hoffe mal, exklusive 1) hinzu

    Ne, inklusive 1, aber dass das zu nem minimalen Fehler führt hat er selbst schon geschrieben. Ich hab nur erst jetzt gecheckt wieso er meint dass das relevant sein könnte...



  • Endlich einer, der mich versteht. Danke distributor.

    Ganz nebenbei sollte die Einbettung immer funktionieren, auch wenn die Daten der Einbettungsmatrix nicht gleichverteilt sind.

    Auf rand() werde ich demnächst wohl verzichten...

    Edit:
    C++11 bietet ja recht viele Zufallsgeneratoren an. Welchen soll ich benutzen?


Anmelden zum Antworten