Zufallszahlen, mal wieder
-
Hallo!
Natürlich habe ich schon gegoogelt aber ich finde einfach nicht eine schöne brauchbare Lösung. Ich möchte mir gleichverteilte (double) Zufallszahlen erzeugen lassen. Quasi genau wie in Matlab mit "rand" (liefert Fließkommazahlen zwischen 0 und 1, z.B. 0.1284, 0.7895, 0.3448).
Wie kann ich das erreichen? Brauche ich zwangsweise eine externe Bibliothek wie Boost (http://viming.de/c++/faq:rand ?)
Danke für's Helfen
-
Mit rand() (und srand) kannst du Ganzzahlen erzeugen. Mach damit einfach Zahlen z.B. mit dem Zielbereich*1000 (je nach gewünschter Genauigkeit variiert die 1000), dividiere diese danach wieder und speichere sie in double-Variablen.
-
Hier ist eine beispiel wie mans macht
http://www.cplusplus.com/reference/clibrary/cstdlib/srand/Achtung: srand() einmal (und nur einmal) aufrufen.
-
Bisher hab ich das halt so gemacht:
// Vorher mit nem seed initialisiert double myDoubleRand() { return (static_cast<double> (rand()) / RAND_MAX); }
Das Problem ist: Die blöden Zahlen wiederholen sich zu schnell. Der scheint mir nicht alle durchzugenerieren, ich bekomme wohl nur 20-30 "zufallszahlen".
Und damit kommt mein Algorithmus nicht hin!
-
rand() schrieb:
Bisher hab ich das halt so gemacht:
// Vorher mit nem seed initialisiert double myDoubleRand() { return (static_cast<double> (rand()) / RAND_MAX); }
Das Problem ist: Die blöden Zahlen wiederholen sich zu schnell. Der scheint mir nicht alle durchzugenerieren, ich bekomme wohl nur 20-30 "zufallszahlen".
Und damit kommt mein Algorithmus nicht hin!Zeig mehr Code, der Fehler liegt definitiv woanders. Der Standardzufallszahlengenerator ist zwar nicht professionell gut, aber eine Periode von ein paar Milliarden hat er schon mindestens. Ich tippe mal darauf, dass du zwischendurch den Seed wieder zurücksetzt.
-
Wenn du einen modernen Compiler hast, kannst du das mit den Klassen aus
<random>
machen. z.B. eine Normalverteilung:std::normal_distribution<double> dist(mean, sigma); std::mt19937 engine; double zufall = engine(dist); double noch_ein_zufall = engine(dist);
oder gleichverteilt:
std::uniform_real<double> dist(min, max); std::mt19937 engine; double zufall = engine(dist); double noch_ein_zufall = engine(dist);
-
brotbernd schrieb:
Wenn du einen modernen Compiler hast, kannst du das mit den Klassen aus
<random>
machen. z.B. eine Normalverteilung:Oder mit Boost.Random: http://www.boost.org/doc/libs/1_44_0/doc/html/boost_random.html
Allerdings reicht
srand
undrand
in den meisten Fällen völlig. Ich stimme daher SeppJ zu, dass da eher ein Fehler im Code vorliegt.Grüssli
-
Ja ok Fehler lag tatsächlich woanders.
Aber gut zu wissen, dass im neueren Standard solch ein generator enthalten ist!