Problem mit rand()%20+1

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
IlikeMyLife
Establishment
Beiträge: 212
Registriert: 08.05.2011, 09:59
Benutzertext: Feel Free

Problem mit rand()%20+1

Beitrag von IlikeMyLife »

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 :-(
Benutzeravatar
Lynxeye
Establishment
Beiträge: 145
Registriert: 27.02.2009, 16:50
Echter Name: Lucas
Wohnort: Hildesheim
Kontaktdaten:

Re: Problem mit rand()%20+1

Beitrag von Lynxeye »

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.
IlikeMyLife
Establishment
Beiträge: 212
Registriert: 08.05.2011, 09:59
Benutzertext: Feel Free

Re: Problem mit rand()%20+1

Beitrag von IlikeMyLife »

danke :-) da lag mein logikfehler. ich bin davon ausgegangen, dass die funktion rand() für sich genommen schon die zeit mit implementiert hat.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2258
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Problem mit rand()%20+1

Beitrag von Zudomon »

Gibt es dafür nicht extra eine Funktion? Bei Delphi heißt die "randomize"
Benutzeravatar
Lynxeye
Establishment
Beiträge: 145
Registriert: 27.02.2009, 16:50
Echter Name: Lucas
Wohnort: Hildesheim
Kontaktdaten:

Re: Problem mit rand()%20+1

Beitrag von Lynxeye »

Zudomon hat geschrieben:Gibt es dafür nicht extra eine Funktion? Bei Delphi heißt die "randomize"
Um mich dazu selbst zu zitieren:
Lynxeye hat geschrieben:Funktion srand()
Benutzeravatar
Zudomon
Establishment
Beiträge: 2258
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Problem mit rand()%20+1

Beitrag von Zudomon »

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.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2516
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Problem mit rand()%20+1

Beitrag von Jonathan »

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))
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: Problem mit rand()%20+1

Beitrag von Artificial Mind »

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...
IlikeMyLife
Establishment
Beiträge: 212
Registriert: 08.05.2011, 09:59
Benutzertext: Feel Free

Re: Problem mit rand()%20+1

Beitrag von IlikeMyLife »

Artificial Mind hat geschrieben:(int)(rand() / (RAND_MAX+1.0f) * 20)[/cn] ist da etwas besser...
mag zwar funktionieren, allerdings reicht für meine zwecke die srand() vollkommen aus.

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.
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: Problem mit rand()%20+1

Beitrag von Helmut »

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.
Hm? Seit wann das denn? Dass das mit dem Modulo nicht ganz korrekt funktioniert wird da erwähnt, ansonsten dürfte rand() tadellos funktionieren..

Floats würde ich jedenfalls nicht für die Zufallsgenerierung verwenden.
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: Problem mit rand()%20+1

Beitrag von kaiserludi »

Helmut hat geschrieben:
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.
Hm? Seit wann das denn? Dass das mit dem Modulo nicht ganz korrekt funktioniert wird da erwähnt, ansonsten dürfte rand() tadellos funktionieren..

Floats würde ich jedenfalls nicht für die Zufallsgenerierung verwenden.
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.
"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]
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: Problem mit rand()%20+1

Beitrag von Artificial Mind »

Helmut hat geschrieben:
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.
Hm? Seit wann das denn? Dass das mit dem Modulo nicht ganz korrekt funktioniert wird da erwähnt, ansonsten dürfte rand() tadellos funktionieren..

Floats würde ich jedenfalls nicht für die Zufallsgenerierung verwenden.
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).
antisteo
Establishment
Beiträge: 918
Registriert: 15.10.2010, 09:26
Wohnort: Dresdem

Re: Problem mit rand()%20+1

Beitrag von antisteo »

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/ )
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.
http://fedoraproject.org/ <-- freies Betriebssystem
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
Benutzeravatar
Artificial Mind
Establishment
Beiträge: 802
Registriert: 17.12.2007, 17:51
Wohnort: Aachen

Re: Problem mit rand()%20+1

Beitrag von Artificial Mind »

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.
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 ;)
Benutzeravatar
grid
Beiträge: 14
Registriert: 02.03.2010, 11:11

Re: Problem mit rand()%20+1

Beitrag von grid »

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).
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.

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.
P.S:Das Beispiel ist aus der Wikipedia
Antworten