Zufallszahlen ÜBER RAND_MAX
-
long x = (rand() << 16) | rand();Diese Verkettung sollte mit einem guten linearen Kongruenzgenerator bis zur fünften Dimension hinreichend zufällig sein.
-
Michael E. schrieb:
linearen Kongruenzgenerator bis zur fünften Dimension
Was sollen diese Worte denn nur bedeuten

-
http://de.wikipedia.org/wiki/Hyperebene
Aber das willst du nicht wirklich lesen

-
Nexus schrieb:
http://de.wikipedia.org/wiki/Hyperebene
Aber das willst du nicht wirklich lesen

Oh je oh je, recht hast du.. Immerhin hab ich jetzt ein neues Wort gelernt (Hyperebene)

-
Hmm irgendwie spuckt das nicht die gewünschten Ergebnisse aus

Das mit dem Multiplizieren is n bisschen hmmm unflexibel.
Es gehen ja doch n paar Zahlen verloren mit dem Multiplizieren und man kann nicht so gut festlegen in welcher reichweite die zahlen sich befinden.Aber ich hätt da so ne Idee:
srand(time(NULL));
int stellenZZahl = 5; //für die Anzahl der Stellen der Zufallszahl (sind ja eigentlich keine richtigen Zufallszahlen^^
unsigned int zufallszahl = 0;
int speicher;
//hier jetzt irgend ne Schleife (for schleife am besten)
//vielleicht in etwa so(nicht getestet)
for(int i = 0; i < stellenZZahl; ++i)
{
speicher = rand()%10;
zufallszahl = zufallszahl + (speicher*(int)pow(speicher, stellenZZahl-i));
}Irgendwie so, is bestimmt noch n denkfehler oder sonstwas drin aber denkt ihr so könnte man theoretisch etwas dynamischer zufallszahlen in größeren bereichen erzeugen?
-
oder man werfe einen kurzen blick auf http://www.boost.org/doc/libs/1_35_0/libs/random/index.html
um einen vorgeschmack auf C++0x-zufallszahlengeneratoren zu bekommen.
-
Stefan Litzel schrieb:
Hmm irgendwie spuckt das nicht die gewünschten Ergebnisse aus

Meine Variante? Wieso?
Aber ich hätt da so ne Idee:
srand(time(NULL));
int stellenZZahl = 5; //für die Anzahl der Stellen der Zufallszahl (sind ja eigentlich keine richtigen Zufallszahlen^^
unsigned int zufallszahl = 0;
int speicher;
//hier jetzt irgend ne Schleife (for schleife am besten)
//vielleicht in etwa so(nicht getestet)
for(int i = 0; i < stellenZZahl; ++i)
{
speicher = rand()%10;
zufallszahl = zufallszahl + (speicher*(int)pow(speicher, stellenZZahl-i));
}Irgendwie so, is bestimmt noch n denkfehler oder sonstwas drin aber denkt ihr so könnte man theoretisch etwas dynamischer zufallszahlen in größeren bereichen erzeugen?
Theoretisch schon. Allerdings solltest du beachten, dass beim standardmäßigen rand-Algorithmus die niederwertigsten Bits am wenigsten zufällig sind. Desweiteren beeinflusst du durch ein Modulo m mit (RAND_MAX + 1)%m != 0 die Wahrscheinlichkeiten für die einzelnen Ziffern. Bei Modulo m mit (RAND_MAX + 1)%m == 0 verkürzt du die Periode. Wenn du diesen Weg also benutzen willst, dass schreib / (RAND_MAX + 1) * 10;
-
nur, weil woanders marc++us uns daran erinnert hat: es gibt einen artikel zu zufallszahlen im magazin, der das, was hier gefragt wird, genau behandelt.
-
Michael E. schrieb:
Stefan Litzel schrieb:
Hmm irgendwie spuckt das nicht die gewünschten Ergebnisse aus

Meine Variante? Wieso?
Aber ich hätt da so ne Idee:
srand(time(NULL));
int stellenZZahl = 5; //für die Anzahl der Stellen der Zufallszahl (sind ja eigentlich keine richtigen Zufallszahlen^^
unsigned int zufallszahl = 0;
int speicher;
//hier jetzt irgend ne Schleife (for schleife am besten)
//vielleicht in etwa so(nicht getestet)
for(int i = 0; i < stellenZZahl; ++i)
{
speicher = rand()%10;
zufallszahl = zufallszahl + (speicher*(int)pow(speicher, stellenZZahl-i));
}Irgendwie so, is bestimmt noch n denkfehler oder sonstwas drin aber denkt ihr so könnte man theoretisch etwas dynamischer zufallszahlen in größeren bereichen erzeugen?
Theoretisch schon. Allerdings solltest du beachten, dass beim standardmäßigen rand-Algorithmus die niederwertigsten Bits am wenigsten zufällig sind. Desweiteren beeinflusst du durch ein Modulo m mit (RAND_MAX + 1)%m != 0 die Wahrscheinlichkeiten für die einzelnen Ziffern. Bei Modulo m mit (RAND_MAX + 1)%m == 0 verkürzt du die Periode. Wenn du diesen Weg also benutzen willst, dass schreib / (RAND_MAX + 1) * 10;
nunja als ich deine variante ausprobierte hats mir die zufallszahlen einfach immer "hochgezählt". D.h es wurde immer größer.
-
Code?
BTW: Hab nochmal drüber nachgedacht. Optimal ist meine Lösung auch nicht, da die resultierenden Zahlen auf einer Spirale liegen. Benutz also am besten boost oder such/schreib dir ne andere Implementierung eines Zufallsgenerators. Stichwörter: Mersenne-Twister, Park-Miller-Generator, inverser Kongruenzgenerator.
-
rand()*RAND_MAX+rand()oder
rand()*RAND_MAX*RAND_MAX+rand()*RAND_MAX+rand()u.s.w.
wenn rand() echt zufällig ist, dann ist das resultierende von meiner funktion auch echt zufällig.
-
Das prob an deiner Lösung is dass ich nicht genau steuern kann wie groß und in welchem bereich die zufallszahlen sind, da die summe von den multiplikationen abhängig vom produkt der multiplikation ist. Und das Produkt ist wiederrum abhängig von den rand() zahlen.
-
Krux schrieb:
rand()*RAND_MAX+rand()oder
rand()*RAND_MAX*RAND_MAX+rand()*RAND_MAX+rand()u.s.w.
wenn rand() echt zufällig ist, dann ist das resultierende von meiner funktion auch echt zufällig.
Das ist doch das, was ich geschrieben hab. Das Resultierende ist eben nicht "echt zufällig" (was immer du darunter verstehst).
Stefan Litzel: Versteh ich nicht. Wieso kannst du die Intervallgröße nicht wie vorher auch mit /(max + 1) * größe skalieren?
-