Problem mit rand()%20+1
-
- Establishment
- Beiträge: 212
- Registriert: 08.05.2011, 09:59
- Benutzertext: Feel Free
Problem mit rand()%20+1
Wie der Titel schon vermuten lässt, geht es um die Erzeugung einer Zufallszahl.
ich habe mit folgender Funktion versucht eine Zufallszahl zu erstellen:
int x = 0;
x = rand()%20+1;
seltsamerweise kann ich die anwendung so oft starten wie ich möchte, allerdings werden mit IMMER
die gleichen zufallszahlen angegeben :-(
ich habe mit folgender Funktion versucht eine Zufallszahl zu erstellen:
int x = 0;
x = rand()%20+1;
seltsamerweise kann ich die anwendung so oft starten wie ich möchte, allerdings werden mit IMMER
die gleichen zufallszahlen angegeben :-(
- Lynxeye
- Establishment
- Beiträge: 145
- Registriert: 27.02.2009, 16:50
- Echter Name: Lucas
- Wohnort: Hildesheim
- Kontaktdaten:
Re: Problem mit rand()%20+1
Du musst vorher den Zufallsgenerator mit einem Seed initalisieren (Funktion srand(). Der Seed wiederum sollte sich bei jeder Programminstanz unterscheiden, also so etwas sein, wie die aktuelle Systemzeit, zu welcher srand() ausgeführt wird. Dazu kannst du time() verwenden.
-
- Establishment
- Beiträge: 212
- Registriert: 08.05.2011, 09:59
- Benutzertext: Feel Free
Re: Problem mit rand()%20+1
danke :-) da lag mein logikfehler. ich bin davon ausgegangen, dass die funktion rand() für sich genommen schon die zeit mit implementiert hat.
Re: Problem mit rand()%20+1
Gibt es dafür nicht extra eine Funktion? Bei Delphi heißt die "randomize"
- Lynxeye
- Establishment
- Beiträge: 145
- Registriert: 27.02.2009, 16:50
- Echter Name: Lucas
- Wohnort: Hildesheim
- Kontaktdaten:
Re: Problem mit rand()%20+1
Um mich dazu selbst zu zitieren:Zudomon hat geschrieben:Gibt es dafür nicht extra eine Funktion? Bei Delphi heißt die "randomize"
Lynxeye hat geschrieben:Funktion srand()
Re: Problem mit rand()%20+1
Haha! Öh, ja.... ich schweig nun mal besser... ach mist, da hab ich ja schon wieder gepostet...
Irgendwie hab ich dann doch das "s" übersehen.
Irgendwie hab ich dann doch das "s" übersehen.
Re: Problem mit rand()%20+1
Ein paar weiterführende Informationen rund um Zufallszahlen in C++
http://magazin.c-plusplus.de/artikel/Zu ... n%20Zufall
(wirklich ein guter Artikel, sollte man mal gelesen haben (ist ja auch nicht soo lang))
http://magazin.c-plusplus.de/artikel/Zu ... n%20Zufall
(wirklich ein guter Artikel, sollte man mal gelesen haben (ist ja auch nicht soo lang))
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
https://jonathank.de/games/
- Artificial Mind
- Establishment
- Beiträge: 802
- Registriert: 17.12.2007, 17:51
- Wohnort: Aachen
Re: Problem mit rand()%20+1
Der Artikel ist ganz nett, aber auf die Problematik, dass man mit rand() % 20 eine schlechte Verteilung bekommt, weil die unteren Bits "weniger zufällig" sind in der Standard-C++-Implementierung, geht er leider nicht ein.
EDIT: (int)(rand() / (RAND_MAX+1.0f) * 20) ist da etwas besser...
EDIT: (int)(rand() / (RAND_MAX+1.0f) * 20) ist da etwas besser...
-
- Establishment
- Beiträge: 212
- Registriert: 08.05.2011, 09:59
- Benutzertext: Feel Free
Re: Problem mit rand()%20+1
mag zwar funktionieren, allerdings reicht für meine zwecke die srand() vollkommen aus.Artificial Mind hat geschrieben:(int)(rand() / (RAND_MAX+1.0f) * 20)[/cn] ist da etwas besser...
um ein bisschen klarheit rein zu bekommen, ein familienmitglied von mir soll für die schule das dividieren erlernen.
ich habe nur einfach nicht die zeit, mir ständig neue aufgaben ausdenken zu können, daher habe ich ein
lernspiel ( etwa 100 zeilen quellcode ) geschrieben, damit fleißig geübt werden kann.
Re: Problem mit rand()%20+1
Hm? Seit wann das denn? Dass das mit dem Modulo nicht ganz korrekt funktioniert wird da erwähnt, ansonsten dürfte rand() tadellos funktionieren..Artificial Mind hat geschrieben:Der Artikel ist ganz nett, aber auf die Problematik, dass man mit rand() % 20 eine schlechte Verteilung bekommt, weil die unteren Bits "weniger zufällig" sind in der Standard-C++-Implementierung, geht er leider nicht ein.
Floats würde ich jedenfalls nicht für die Zufallsgenerierung verwenden.
-
- Establishment
- Beiträge: 467
- Registriert: 18.04.2002, 15:31
Re: Problem mit rand()%20+1
Was ich in dem Artikel vermisse, ist ein Hinweis darauf, dass man auch plattformspezifische Zeitfunktionen mit besserer Auflösung als der Sekundenauflösung aus der C Standardlib verwenden kann, um den Seed zu generieren, so dass das Ganze auch noch funktioniert, wenn man mehrere Instanzen seiner Applikation innerhalb einer Sekunde startet.Helmut hat geschrieben:Hm? Seit wann das denn? Dass das mit dem Modulo nicht ganz korrekt funktioniert wird da erwähnt, ansonsten dürfte rand() tadellos funktionieren..Artificial Mind hat geschrieben:Der Artikel ist ganz nett, aber auf die Problematik, dass man mit rand() % 20 eine schlechte Verteilung bekommt, weil die unteren Bits "weniger zufällig" sind in der Standard-C++-Implementierung, geht er leider nicht ein.
Floats würde ich jedenfalls nicht für die Zufallsgenerierung verwenden.
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da :)
"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
DirectGL, endlich ist es da :)
"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
- Artificial Mind
- Establishment
- Beiträge: 802
- Registriert: 17.12.2007, 17:51
- Wohnort: Aachen
Re: Problem mit rand()%20+1
je nach Implementierung haben die unteren Bits eine ungünstige Verteilung, steht sonst auch in den man-pages ( http://linux.die.net/man/3/rand ). Wenn man "high quality random numbers" haben möchte, sollte man die boost random numbers nehmen oder gleich die GNU Scientific Library ( http://www.gnu.org/software/gsl/ )Helmut hat geschrieben:Hm? Seit wann das denn? Dass das mit dem Modulo nicht ganz korrekt funktioniert wird da erwähnt, ansonsten dürfte rand() tadellos funktionieren..Artificial Mind hat geschrieben:Der Artikel ist ganz nett, aber auf die Problematik, dass man mit rand() % 20 eine schlechte Verteilung bekommt, weil die unteren Bits "weniger zufällig" sind in der Standard-C++-Implementierung, geht er leider nicht ein.
Floats würde ich jedenfalls nicht für die Zufallsgenerierung verwenden.
Die Floats habe ich genommen, damit die oberen Bits die Zahl bestimmen und nicht die Unteren (wie dies bei % 20 hauptsächlich der Fall wäre).
Re: Problem mit rand()%20+1
Wenn du schon von Linux redest, kann man gleich die echten Zufallszahlen von /dev/random lesen. Oder halt, falls man viele Zahlen braucht, von /dev/urandom, welches kontinuierlich Zufallszahlen liefert, jedoch nur so viel Entropie reinstecken kann, wie durch zufällige HW-Ereignisse reinkommt.Artificial Mind hat geschrieben: je nach Implementierung haben die unteren Bits eine ungünstige Verteilung, steht sonst auch in den man-pages ( http://linux.die.net/man/3/rand ). Wenn man "high quality random numbers" haben möchte, sollte man die boost random numbers nehmen oder gleich die GNU Scientific Library ( http://www.gnu.org/software/gsl/ )
http://fedoraproject.org/ <-- freies Betriebssystem
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
- Artificial Mind
- Establishment
- Beiträge: 802
- Registriert: 17.12.2007, 17:51
- Wohnort: Aachen
Re: Problem mit rand()%20+1
Das ist kein Linux-spezifisches Problem. Die man-page hab ich nur als Referenz angegeben. Aber ILikeMyLife mus sich zum Glück nicht darum kümmern, wenn es "nur" um ein bisschen Edu-Software geht ;)antisteo hat geschrieben:Wenn du schon von Linux redest, kann man gleich die echten Zufallszahlen von /dev/random lesen. Oder halt, falls man viele Zahlen braucht, von /dev/urandom, welches kontinuierlich Zufallszahlen liefert, jedoch nur so viel Entropie reinstecken kann, wie durch zufällige HW-Ereignisse reinkommt.
Re: Problem mit rand()%20+1
Im Übrigen kann man mit C++11 den <random> Header bemühen und hat damit quasi die boost::random Implementierung. Damit kann man ohne großen Aufwand die Verteilung festlegen und sich eine passende Engine aussuchen.Artificial Mind hat geschrieben:je nach Implementierung haben die unteren Bits eine ungünstige Verteilung, steht sonst auch in den man-pages ( http://linux.die.net/man/3/rand ). Wenn man "high quality random numbers" haben möchte, sollte man die boost random numbers nehmen oder gleich die GNU Scientific Library ( http://www.gnu.org/software/gsl/ )
Die Floats habe ich genommen, damit die oberen Bits die Zahl bestimmen und nicht die Unteren (wie dies bei % 20 hauptsächlich der Fall wäre).
Code: Alles auswählen
#include <random>
#include <functional>
std::uniform_int_distribution<int> distribution(1, 20);
std::mt19937 engine; // Mersenne twister MT19937
auto generator = std::bind(distribution, engine);
int random = generator(); // Generate a uniform integral variate between 1 and 20.