Zufallszahlen sind nicht zufällig genug



  • Ich will mit Hilfe eines Zufallsgenerator viele Zufallszahlen erzeugen. Ich habe das bissher so gelöst:

    srand((unsigned) time(&t));
    float zufall;
    for(int i = 1; i<=10; i++)
    {
       zufall = (rand() % 20 - 10) / 10.0f;
       gegner_posy[i][1] = zufall + 0.6f;
       gegner_posy[i][2] = zufall + 0.8f;
       gegner_posy[i][3] = zufall + 0.8f;        
    }
    

    Das Problem ist das die Zufallszahlen nicht wirklich zufällig sind.

    Gibt es eine andere Möglichkeit Zufallszahlen zu erzeugen?

    .gez flammenvogel



  • Was ist genau das Problem mit den Zahlen? Sind sie einfach nicht ordentlich gleichverteilt oder so? Dann kannst Du mal bei boost www.boost.org vorbeischaun, die haben verschiedene andere Generatoren.
    Wenn's aber echte Zufallszahlen sein müssen, dann haste ein Problem, die kann man nämlich allein im Rechner ohne Zusatzhardware nicht erzeugen.

    MfG Jester



  • lol, das thema hatten wir doch schon vorn paar tagen; hätteste mal die suchfunktion benutzt:

    http://www.c-plusplus.net/forum/viewtopic.php?t=82171&highlight=zufallszahlen

    Mr. b



  • was erwartest du? der computer kann nur mit spezieller zusatzhardware über termisches rauschen oder ähnliches echte zufallszahlen bestimmen, sowas hat aber niemand im pc.

    rand ist nur eine schön komplexe formel mit speziell ausgewählten konstanten, die das zufällige vortäuschen können.



  • Jester schrieb:

    Was ist genau das Problem mit den Zahlen? Sind sie einfach nicht ordentlich gleichverteilt oder so? Dann kannst Du mal bei boost www.boost.org vorbeischaun, die haben verschiedene andere Generatoren.
    Wenn's aber echte Zufallszahlen sein müssen, dann haste ein Problem, die kann man nämlich allein im Rechner ohne Zusatzhardware nicht erzeugen.
    MfG Jester

    rand() ist schon gut. ich möchte mal den sehen, der dabei nen fehler selber sieht.
    der code

    gegner_posy[i][1] = zufall + 0.6f;
    

    sagt wohl klar, daß keine mathematisch ausgefeilten eigenschaften gefordert sind, sondern einfach ein gegener, der nicht vom menschen leicht berechenbar ist und ne gleichverteilung, damit der gegener nicht sichtbar driftet.

    "echte" zufallszahlen sind auch nicht benötigt.



  • flammenvogel schrieb:

    Ich will mit Hilfe eines Zufallsgenerator viele Zufallszahlen erzeugen. Ich habe das bissher so gelöst:

    srand((unsigned) time(&t));
    float zufall;
    for(int i = 1; i<=10; i++)
    {
       zufall = (rand() % 20 - 10) / 10.0f;
       gegner_posy[i][1] = zufall + 0.6f;
       gegner_posy[i][2] = zufall + 0.8f;
       gegner_posy[i][3] = zufall + 0.8f;        
    }
    

    Das Problem ist das die Zufallszahlen nicht wirklich zufällig sind.

    Gibt es eine andere Möglichkeit Zufallszahlen zu erzeugen?

    .gez flammenvogel



  • Das Problem bei meinem Code ist das die Zufallszahlen fast regelmäßig ansteigen. Ich programmiere ein Spiel, wo die Funktion rand() zum zufälligen Positionieren des Gegners benutzt wird.

    Kennt jemmand wirklich keine Möglichkeit die Sache zufälliger zu machen ???

    PS: Ich brauche Zufallszahlen zwischen -1.0 und 1.0 (opengl). die sachen die nachträglich zu den Zufallszahlen adiert werden sind nur für die größe des Gegners wichtig -> Spielen für die Zufälligkeit keine Rolle



  • flammenvogel schrieb:

    Das Problem bei meinem Code ist das die Zufallszahlen fast regelmäßig ansteigen.

    ok. problem ist bekannt.
    hab ich außerdem oben schon beantwortet, nur hat das mist-forum wiedermal meinen beitrag verschluckt.

    mach srand nur einmal im programm. am besten am anang der main.

    machste srand(time(0)) immer vor rand, dann steigt der wert des direkt nach srand ausgelesenen zufalls im sekundentakt um eins an.



  • Wie oft rufst du denn srand() auf? Wenn deine Zahlen ansteigen, machst du irgendwas falsch.

    EDIT: Tja, da war ich wohl zu langsam...





  • komisch jetzt funktioniert es wenn ich srand(time(0)) am Anfang des Progs einmal aufrufe.

    Danke

    edit: Ich bin Flammenvogel. WIr arbeiten am gleichem PC und er hat vergessen den Namen zu wechseln...



  • ist auchd er sinn der sache, dass srand nur einmal seeded


Log in to reply