Zufallszahl zwischen 0 und 49
-
Hallo,
wie kann man eine Zufallszahl z.B. zwischen 0 und 49 mit srand erzeugen?
Danke schon mal im Voraus
Gruß A.
-
Mit srand garnicht. Aber mit rand.
Siehe auch: http://www.c-plusplus.net/forum/viewtopic-var-t-is-172876.html
-
srand(time(0)); int zufall=rand()%variable;
-
Okay, habs verstanden! Danke
-
wichtig:
das srand nicht jedes mal aufrufen, sondern nur, wenn der rnd zurückgesetzt werden soll.
-
langeweile schrieb:
srand(time(0)); int zufall=rand()%variable;
Schlecht, da die Zahlen dann nicht gleichmäßig verteilt sind!
-
Erwin2777 schrieb:
langeweile schrieb:
srand(time(0)); int zufall=rand()%variable;
Schlecht, da die Zahlen dann nicht gleichmäßig verteilt sind!
Die Verteilung passt mir auch nicht wirklich. Wiederholt sich auch recht schnell (in meiner Implementierung).
Daher benutze ich boost::random.Habe sogar mal gehört, dass es schneller ist, als rand().
-
Erwin2777 schrieb:
langeweile schrieb:
srand(time(0)); int zufall=rand()%variable;
Schlecht, da die Zahlen dann nicht gleichmäßig verteilt sind!
reg dich ab. wie groß ist denn der fehler? die zahlen unter 35 kommen um 0.15% häufiger vor, oder? selten, daß es sich lohnen würde, das bißchen schieflage noch zu beseitigen.
-
volkard schrieb:
Erwin2777 schrieb:
langeweile schrieb:
srand(time(0)); int zufall=rand()%variable;
Schlecht, da die Zahlen dann nicht gleichmäßig verteilt sind!
reg dich ab. wie groß ist denn der fehler? die zahlen unter 35 kommen um 0.15% häufiger vor, oder? selten, daß es sich lohnen würde, das bißchen schieflage noch zu beseitigen.
Hmm. Ich hatte bei mir Probleme, dass es sich sehr schnell wiederholt hat. Ich habe Punkte im 2D verteilt und da hat sich dann ein sehr regelmässiges Muster rausgebildet. Ich probier das die Tage vlt. mal noch im Vergleich mit boost::random aus. Mal schauen.
-
drakon schrieb:
Wiederholt sich auch recht schnell (in meiner Implementierung).
das kannst du ändern, indem du srand(time(0)) nur einmal im programm aufrufst.
du willst mir sicher nicht erzählen, eine periodenlänge von 2^32 würde dir nicht reichen.
-
volkard schrieb:
drakon schrieb:
Wiederholt sich auch recht schnell (in meiner Implementierung).
das kannst du ändern, indem du srand(time(0)) nur einmal im programm aufrufst.
du willst mir sicher nicht erzählen, eine periodenlänge von 2^32 würde dir nicht reichen.Hmm. Ist ein weilchen her, aber ich habe srand nur einmal aufgerufen.
Ich muss es mir nochmal anschauen. Vlt. finde ich den Code ja noch..
-
drakon schrieb:
Hmm. Ich hatte bei mir Probleme, dass es sich sehr schnell wiederholt hat.
das ist in der tat üblich bei linearen kongruenzgeneratoren, wie rand() sie normalerweise benutzt. das hat nichts mit per periodenlänge und auch nichts mit der schieflage zu tun.
einen netten aus boost::random auszusuchen, behebt das problem.
-
in der aktuellen c't gibts nen netten artikel über zufallsgenerartoren.
wie man sich zum beispiel einen hardware-rng baut
-
volkard schrieb:
drakon schrieb:
Hmm. Ich hatte bei mir Probleme, dass es sich sehr schnell wiederholt hat.
das ist in der tat üblich bei linearen kongruenzgeneratoren, wie rand() sie normalerweise benutzt. das hat nichts mit per periodenlänge und auch nichts mit der schieflage zu tun.
einen netten aus boost::random auszusuchen, behebt das problem.Habe ich auch nicht behauptet.
Ich bin jetzt neugierig geworden und mache einmal ein paar Tests mit boost und rand.
-
drakon schrieb:
Ich bin jetzt neugierig geworden und mache einmal ein paar Tests mit boost und rand.
wäre nett, wenn du dabei auch was wie http://en.wikipedia.org/wiki/Diehard_tests benutzen würdest.
-
volkard schrieb:
drakon schrieb:
Ich bin jetzt neugierig geworden und mache einmal ein paar Tests mit boost und rand.
wäre nett, wenn du dabei auch was wie http://en.wikipedia.org/wiki/Diehard_tests benutzen würdest.
Hmm. Interessant. Ja, mal schauen.
-
Der Mersenne Twister sollte ganz gut sein, und auch relativ performant, da er hauptsächlich auf bitweisen Operationen basiert. Der ist auch in Boost vorhanden.
-
Nexus schrieb:
Der Mersenne Twister sollte ganz gut sein, und auch relativ performant, da er hauptsächlich auf bitweisen Operationen basiert. Der ist auch in Boost vorhanden.
auf der seite des tristers steht schon ewig lange, daß er schnell sei. verflixt schnell.
aber der war bei mir um faktor 4 lahngsamer als rand().
ich nehme rand(), wenns schnell gehn soll. oder einen multiply-with-carry-generator, wenn ich ihn finde.