rand() zwischen -1 und 1



  • Hallo alle. Könnten sie mir helfen:
    Ich möchte eine Funkcion machen, die zufällig die Nummer -1,0 oder 1 ausfählt. ich habe solches geschrieben:
    RDir[0] = (int)(rand()/(RAND_MAX / 3)-1);//[-1 1]
    aber sie ´propobility distibution´ ist nich richtig. zu viel 0 und -1...
    Danke



  • (rand()%3)-1
    

    Bei (rand()%3) kommt entweder 0, 1 oder 2 raus --> -1 --> ein Wert von -1, 0 oder 1.



  • int special_rand(void)
    {
        int nums[3] = { -1, 0, 1 };
        return ( nums[rand() % 3] );
    }
    

    wäre eine alternative



  • Hier im Forum gibt es ein Magazin (Link siehst du ganz oben rechts) da müsste ein Artikel über rand() drin sein. Wenn du Gleichverteilung haben möchtest ist ein einfaches Modulo nicht unbedingt geeignet.



  • Ja, das arbeitet, aber probability distribution ist solches:
    -1: 357,0: 169, 1: 59
    Warscheinlich mit der time() Funkcion das man implementiern kann...



  • ontos schrieb:

    Ja, das arbeitet, aber probability distribution ist solches:
    -1: 357,0: 169, 1: 59
    Warscheinlich mit der time() Funkcion das man implementiern kann...

    Erstmal: probability distribution heißt auf Deutsch Wahrscheinlichkeitsverteilung.

    Ein Ergebnis eines Versuchs ist niemals eine Wahrscheinlichkeitsverteilung. Deshalb ist es auch völlig normal, dass die Werte nicht absolut gleichverteilt sind. Wenn du immer eine totale Gleichverteilung haben möchtest, solltest du dir Permutationen/ random_shuffle() angucken.



  • ontos schrieb:

    Ja, das arbeitet, aber probability distribution ist solches:
    -1: 357,0: 169, 1: 59
    Warscheinlich mit der time() Funkcion das man implementiern kann...

    den letzten satz verstehe ich nicht. ansonsten scheint das verfahren ganz gut zu funktionieren.



  • Michael E. schrieb:

    ontos schrieb:

    Ja, das arbeitet, aber probability distribution ist solches:
    -1: 357,0: 169, 1: 59
    Warscheinlich mit der time() Funkcion das man implementiern kann...

    Erstmal: probability distribution heißt auf Deutsch Wahrscheinlichkeitsverteilung.

    Ein Ergebnis eines Versuchs ist niemals eine Wahrscheinlichkeitsverteilung. Deshalb ist es auch völlig normal, dass die Werte nicht absolut gleichverteilt sind. Wenn du immer eine totale Gleichverteilung haben möchtest, solltest du dir Permutationen/ random_shuffle() angucken.

    Ist das nich mehr als einen Versuch den er durchgeführt hat? IMHO hat er eine Zufallsvariable die drei Ereignisse annehmen kann und die einer Gleichverteilung folgen soll. Nun zieht er 585 mal ein Element aus der Verteilung. Ich weiß nicht wie das aussieht wenn er mal 10000 Zahlen generiert aber momentan kommt mir das etwas verzerrt vor. 🙂



  • Xantus schrieb:

    int special_rand(void)
    {
        int nums[3] = { -1, 0, 1 };
        return ( nums[rand() % 3] );
    }
    

    wäre eine alternative

    Und zwar eine relativ verschwenderische, bei der du auch nichts gewinnst. Oder war das nur ein Trollpost?

    Elite-Progger schrieb:

    Wenn du Gleichverteilung haben möchtest ist ein einfaches Modulo nicht unbedingt geeignet.

    Bei einer so kleinen Spanne der Werte ist das aber vernachlässigbar.



  • TheTester schrieb:

    Ist das nich mehr als einen Versuch den er durchgeführt hat?

    Vielleicht kommt ein völlig anderes Ergebnis raus, wenn man nochmal laufen lässt? Er hat nämlich eine Stichprobe von 585 Werten genommen. Das lässt aber noch nicht wirklich Rückschlüsse zu.



  • Nexus schrieb:

    Oder war das nur ein Trollpost?

    Nah komm, reiß dich zusammen.



  • Jester schrieb:

    TheTester schrieb:

    Ist das nich mehr als einen Versuch den er durchgeführt hat?

    Vielleicht kommt ein völlig anderes Ergebnis raus, wenn man nochmal laufen lässt? Er hat nämlich eine Stichprobe von 585 Werten genommen. Das lässt aber noch nicht wirklich Rückschlüsse zu.

    Das lässt schon Rückschlüsse zu, bei normalverteilten ZV liegt die Grenze bei n > 30 um eine halbwegs vernünftige Aussage treffen zu können. Unsere Grundgesamtheit hier besteht aus 3 Elementen, wir ziehen fast 600 mal mit Zurücklegen. Man kann es übrigens auch so sehen das 585x Stichproben der Länge 1 gezogen wurden. Wenn man einen Chi-Quadrat Test drüber jagt bezweifle ich das bei den Ergebnissen von einer Gleichverteilung die Rede sein kann.

    Gehen wir mal davon aus wir haben 3 "Ereignisse" alle 3 haben die gleiche Eintrittswahrscheinlichkeit, bei 585 Ziehungen liegt der Erwartungswert bei 195.

    Um das Ganze abzurunden habe ich mal mit Excel ein paar mal 585 Werte im Bereich -1,0,1 generiert, das Ergebnis ist ungefähr eine Variabilität von 220-170 in den Ereignissen. Ich bleibe dabei das die obigen Ergebnisse ziemlich daneben sind.



  • TheTester schrieb:

    Ich bleibe dabei das die obigen Ergebnisse ziemlich daneben sind.

    Ja, das sehe ich auch so. Bei mir kommen deutlich andere Ergebnisse raus, allerdings ziehe ich ein bißchen öfter, damit's nicht so rauscht... und ja, man kann es auch als 585-fache Ausführung eines Tests mit 0 Aussagekraft werten, aber ich denk das bringt einen nicht wirklich weiter.

    Wo hast Du eigentlich die Aussage mit den 30 Stichproben für die normalverteilte ZV her?



  • Jester schrieb:

    Wo hast Du eigentlich die Aussage mit den 30 Stichproben für die normalverteilte ZV her?

    Müsst ich nachschauen, IMHO kommt das aus dem zentralen Grenzwertsatz, das für ein n >= 30 das arithmetische Mittel der Stichprobe gegen eine Normalverteilung strebt.

    EDIT: Was ich noch vergessen habe n ist die Länge der Stichprobe.



  • Aber wäre diese Abweichung nicht durchaus im Rahmen des Linearen Kongruenzgenerators rand() (natürlich eher in Ausnahmefällen)? Klar kann man dabei nicht mehr von Gleichverteilung sprechen. Ich erhalte zwar auch kleinere Abweichungen, aber vereinzelt könnte sowas doch auftreten, oder?

    @ontos: Bist du dir sicher, dass du den Code richtig implementiert hast? Oder hast du evtl. mehrmals srand() aufgerufen?

    BTW:

    Jester schrieb:

    Nexus schrieb:

    Oder war das nur ein Trollpost?

    Nah komm, reiß dich zusammen.

    Sorry, ich meinte das nicht persönlich. Aber in letzter Zeit kann man sich echt nicht mehr sicher sein... Tut mir echt leid, wenn der Vorschlag ernst gemeint war, ich wollte nicht beleidigend wirken.

    Aber du musst zugeben: eine Lösungsvariante, die nur komplizierter ist, dabei aber keinen Vorteil bringt, ist wohl schon trollverdächtig. Vor allem, wenn vorher gerade eine kurze, optimale Variante gepostet wurde, die das Gleiche macht.



  • Ich denke, am sichersten wärs, wenn der OT seinen Code mal postet, anstatt dass wir drüber diskutieren, wie unwahrscheinlich ein solches Ergebnis ist 😉



  • Michael E. schrieb:

    Ich denke, am sichersten wärs, wenn der OT seinen Code mal postet, anstatt dass wir drüber diskutieren, wie unwahrscheinlich ein solches Ergebnis ist 😉

    Uhm ist das nich sein Code?

    RDir[0] = (int)(rand()/(RAND_MAX / 3)-1);//[-1 1]
    

    Natürlich müsste man noch den seed kennen aber kann gut sein das er nur rand() aufgerufen hat.



  • Aber er postete ja seine "probability distribution", nachdem er die Vorschläge erhalten hatte...

    Von daher würde ich eventuell noch ein bisschen warten mit Diskutieren 🙂

    @ ontos: Poste doch bitte noch einmal den Code, den du für die Wahrscheinlichkeitsverteilung benutzt hast 😉



  • Nexus schrieb:

    Aber er postete ja seine "probability distribution", nachdem er die Vorschläge erhalten hatte...

    Von daher würde ich eventuell noch ein bisschen warten mit Diskutieren 🙂

    Ah, hatte das dann anders verstanden, dachte er hat die Verteilung von seinem ersten Durchlauf noch nachgereicht, da sie seinem geschilderten Problem im ersten Post entsprach (zuviele -1 und 0). 🙂



  • TheTester schrieb:

    Nexus schrieb:

    Aber er postete ja seine "probability distribution", nachdem er die Vorschläge erhalten hatte...

    Von daher würde ich eventuell noch ein bisschen warten mit Diskutieren 🙂

    Ah, hatte das dann anders verstanden, dachte er hat die Verteilung von seinem ersten Durchlauf noch nachgereicht, da sie seinem geschilderten Problem im ersten Post entsprach (zuviele -1 und 0). 🙂

    Auch möglich 🙂
    Aber warten wir doch einfach, bis er seinen Code noch einmal postet 😉


Log in to reply