Hallo,
ich möchte ein "Würfelspiel" programmieren (im Atmel Studio Simulator)
und mit dem folgenden Beispiel sehen, wie oft eine "zufällige Zahl" bei
10000 Versuchen gewürfelt wurde.
Aber ich erhalte als Wert für zz immer 5"
Was mache ich falsch?
m. g. schrieb:> Was mache ich falsch?
Du initialisierst den Zufallsgenerator nicht mit einer Zufallszahl. Und
rand() berechnet immer nur eine Zufallszahl aus der vorherigen
Zufallszahl. Wenn du also immer mit 0 startest, kommt als nächste Zahl
immmer 5...
Das Stichwort ist: seed()
Daniel A. schrieb:> Am sichtbaren code liegt's nicht.
So ist es:
http://codepad.org/PZAlZSmo
Lothar M. schrieb:> m. g. schrieb:>> Was mache ich falsch?> Du initialisierst den Zufallsgenerator nicht mit einer Zufallszahl. Und> rand() berechnet immer nur eine Zufallszahl aus der /vorherigen/> Zufallszahl. Wenn du also immer mit 0 startest, kommt als nächste Zahl> immmer 5...
Wo steht denn im Source, dass er immer mit 0 startet? Dann müsste er
auch vor jedem rand() erst seed() mit 0 aufrufen. Tut er aber nicht.
rand() berechnet die nächste Zufallszahl aus rand(). Wenn die immer
gleich wäre, kannst Du rand() in die Tonne kloppen. Daher tippe ich
weiter auf den Simulator, der schon in vielen AVR-Threads der böse Bube
war.
Habe den obigen Source leicht geändert für Linux:
Das sagt Google dazu:
In der Bibliothek stdlib.h gibt es die Funktion rand(), welche eine
Pseudo-Zufallszahl zurückgibt. Die Zahl liegt zwischen 0 und einer
maximalen Zahl, welche mit der symbolischen Konstante RAND_MAX abgefragt
werden kann. Möchte man den Bereich der Zufallszahl eingrenzen, kann der
Modulo-Operator verwendet werden. Bevor die Zufallszahlen erstellt
werden, sollte die Funktion srand() aufgerufen werden. Diese
initialisiert den Zufallszahlen-Generator, um die Zufälligkeit der
Zahlen zu gewährleisten. Im Parameter wird ein Zeitstempel übergeben,
deshalb muss auch die time.h eingebunden werden.
http://www.c-howto.de/tutorial-uebungen-teil1.html
Piet schrieb:> Bevor die Zufallszahlen erstellt werden, sollte die Funktion srand()> aufgerufen werden.
Aber nur deshalb, weil sonst bei jedem Programmstart die gleiche
Zufallszahlensequenz kommt.
Mit srand() gibts hier z.B. immer unterschiedliche Verteilung:
http://codepad.org/bYnXBNA2http://codepad.org/KEhj5dr4
Ohne srand() immer die gleiche:
http://codepad.org/3Tb2LzcDhttp://codepad.org/1cm5k5lqFrank M. schrieb:> Daher tippe ich weiter auf den Simulator, der schon in vielen> AVR-Threads der böse Bube war.
Man müsste wissen, was rand() genau macht. Denn diese Funktion
funktioniert hier offenbar nicht...
Frank M. schrieb:> m. g. schrieb:>> Was mache ich falsch?>> Du vertraust zu sehr dem Simulator.
Muss nicht sein. Kann auch eine Fehlbedienung bzw. Fehlinterpretation
sein.
Gerade Neulinge sind mit dem Wort 'dauernd' oft sehr voreilig.
Er steppt einmal durch den Code und kriegt eine 5. Dann steppt er in der
Schleife weiter und die nächste von rand() gelieferte Zahl mündet wieder
in einer 5 und schon ist das 'dauernd'.
Oder er startet das Programm neu und kriegt (no na) wieder als erste
Würfelzahl eine 5.
Das rand() nicht funktioniert können wir wahrscheinlich ausschliessen.
rand() ist keine Raketentechnik sondern simpel - und das
plattformübergreifend.