Hallo, ich benötige einen Zufallszahlengenerator, der mir Zufallszahlen aus einem vorher festgelegten Zahlenbereich erzeugt. Z.B.: my_rand_init( int64_t seed, int64_t start, int64_t stop ); uint64_t my_rand( ); Wichtig ist auch, dass eine erzeugte Zufallszahl nicht noch einmal vorkommen darf. Gibt es so etwas schon? Wenn ja: Wo? Wenn nicht: Hat jemand eine Idee, wie das am besten zu realisieren ist? Ach so, ich programmiere in C++, wobei C-Funktionen natürlich auch okay sind ;-). Viele Grüße Bastian
Hi, On Mon, 29 Sep 2003, Bastian Schern wrote:
Hallo,
ich benötige einen Zufallszahlengenerator, der mir Zufallszahlen aus einem vorher festgelegten Zahlenbereich erzeugt. Z.B.:
my_rand_init( int64_t seed, int64_t start, int64_t stop ); uint64_t my_rand( );
Wichtig ist auch, dass eine erzeugte Zufallszahl nicht noch einmal vorkommen darf.
Fuer diese Funktionalitaet brauchst du ne Liste von schon vorgekommenen Zahlen (um sie dann auszuschliessen). Ja nach Range von (stop-start) ist dies nicht praktikabel, selbst wenn du ein bitmap nimmst. Davon abgesehen kannst du ja einfach die Funktionalitaet auf random(3) aufbauen, also sowas ungefaehr: static int64_t start,stop; int64t my_rand(void) { return (int64_t) ((double)random() / (double)RAND_MAX * (double)(stop-start))+start; } Mit ein wenig Hirnschmalz kannst du evtl. den Weg ueber (double) verhindern, der oben bloss des einfachen overflow-Schutzes drin ist. Ciao, Micha.
Hi, Am 29.09.2003 17:03 schrieb Michael Matz:
On Mon, 29 Sep 2003, Bastian Schern wrote:
ich benötige einen Zufallszahlengenerator, der mir Zufallszahlen aus einem vorher festgelegten Zahlenbereich erzeugt. Z.B.:
my_rand_init( int64_t seed, int64_t start, int64_t stop ); uint64_t my_rand( );
Wichtig ist auch, dass eine erzeugte Zufallszahl nicht noch einmal vorkommen darf.
Fuer diese Funktionalitaet brauchst du ne Liste von schon vorgekommenen Zahlen (um sie dann auszuschliessen). Ja nach Range von (stop-start) ist dies nicht praktikabel, selbst wenn du ein bitmap nimmst.
Es waere auch nicht exakt, da die moeglichen Permutationen nicht mit der gleiche Wahrscheinlichkeit erzeugt werden wuerden. Mache besser folgendes: Baue ein array auf und vertausche jedes Element mit einem anderem zufaellig gewaehlten Element. -Joerg
Am Montag, 29. September 2003 16:50 schrieb Bastian Schern:
Hallo,
ich benötige einen Zufallszahlengenerator, der mir Zufallszahlen aus einem vorher festgelegten Zahlenbereich erzeugt. Z.B.:
my_rand_init( int64_t seed, int64_t start, int64_t stop ); uint64_t my_rand( );
Wichtig ist auch, dass eine erzeugte Zufallszahl nicht noch einmal vorkommen darf.
Gibt es so etwas schon? Wenn ja: Wo?
Das Prinzip ist hier zu finden: http://www.ruwela.de/download/Cpp-Beispiele.pdf Lottozahlen 6 aus 49 ohne Wiederholung. Gruß, Holger -- Tabs, progs & docs http://www.sgt-hulder.de Man kauft das, was man nicht braucht, mit dem Geld das man nicht hat, um dem zu imponieren, den man nicht mag.
Am Montag, 29. September 2003 16:50 schrieb Bastian Schern:
Hallo,
ich benötige einen Zufallszahlengenerator, der mir Zufallszahlen aus einem vorher festgelegten Zahlenbereich erzeugt. Z.B.:
my_rand_init( int64_t seed, int64_t start, int64_t stop ); uint64_t my_rand( );
Wichtig ist auch, dass eine erzeugte Zufallszahl nicht noch einmal vorkommen darf.
Gibt es so etwas schon? Wenn ja: Wo? Wenn nicht: Hat jemand eine Idee, wie das am besten zu realisieren ist?
Ach so, ich programmiere in C++, wobei C-Funktionen natürlich auch okay sind ;-).
Viele Grüße Bastian
Hab dasselbe auch schon benötigt und mir die notwendigen Funktionen in C++ selbst geschrieben. Sie funktionieren. Im Anhang befindet sich eine Header-Datei (in der beschrieben ist was die Funktionen machen) und die zugehörige cpp Datei. Die Funktion slrandList() ist die du brauchst. ( Die Funktion slrandList() benötigt wiederum die anderen Funktionen in der Datei). -- Stefan Lang EMail: langstefan@gmx.at
Hello, On Wed, 01 Oct 2003, Stefan Lang wrote:
Die Funktion slrandList() ist die du brauchst. ( Die Funktion slrandList() benötigt wiederum die anderen Funktionen in der Datei).
Du solltest den seed wohl besser aus /dev/u?random holen (unter linux), z.B.: unsigned int seed; #ifdef __linux__ && HAVE_DEV_RANDOM /* oder so aehnlich */ ifstream rand("/dev/random"); rand >> seed; rand.close(); #else time_t t = time(NULL); /* ... */ seed = ...; #endif srand(seed); -dnh -- 1. Every good work of software starts by scratching a developer's personal itch. --- Eric S. Raymond, "The Cathedral and the Bazaar"
Hallo *,
vielen Dank für eure Anregungen. Ich habe mir jetzt was zusammen
gebastelt, was auch sehr performant ist. Der "Lotto" Algorithmus ist der
absolut langsamste, aber sehr gut für einen großen Zahlenbereich mit
wenigen Zufallswerten geeignet. Ich habe mich für die Lösung mit dem
Array entschieden, da sie erheblich schneller ist. Ich werde
wahrscheinlich bis an die 1.000.000 Zufallszahlen benötigen.
Damit ich den Algorithmus schnell wechseln kann und ich alle auch mal
testen kann, habe ich mein Programm so gestaltet, dass man den
Algorithmus beim Programmstart auswählen kann.
Hier ist jetzt der entscheidende Ausschnitt aus meinem Programmcode:
typedef uint64_t pkt_num_t;
bool sample( vector
participants (6)
-
Bastian Schern
-
David Haller
-
Holger Macht
-
Jörg Zimmermann
-
Michael Matz
-
Stefan Lang