Zufallszahlen bei 64 und 32 Bit
-
Hi,
ich hab einen __int32 und einen __int64 für beide möchte ich gerne eine Zufallszahl haben! da rand()%x ja nur einen int16 zurückgibt bräuchte ich etwas mehr an zufall!
Weis einer wie das geht?
-
zweimal int16 ist int32 und viermal int16 ist int64
einfach einen 16Bit wert errechnen und die bits speichern (Hi und Loword)
-
Warum bits speichern?
Wie wäre es mit rand+rand*pow(2,16) für 32 Bit und rand+rand*pow(2,16)+rand*pow(2,32)+rand*pow(2,48) für 64 Bit.
Grundsätzlich muss man aber dazu sagen, daß sich bei dieser Methode die Warscheinlichkeiten stark nach oben verlagern.
Und da würde mir auf anhieb nichts einfallen um den "verschobenen" Zufall wieder gleichmäßig hinzu bekommen
-
Da gibts doch unendlich viele Möglichkeiten, z.B.
64mal rand() und immer nur das erste (most significant) Bit nehmen.Oder nimm die Methode von Shade, die passt doch (selbstverständlich ungetestet).
zahl = (rand() << 16) + rand();
-
NobbZ schrieb:
Warum bits speichern?
Wie wäre es mit rand+rand*pow(2,16) für 32 Bit und rand+rand*pow(2,16)+rand*pow(2,32)+rand*pow(2,48) für 64 Bit.
Grundsätzlich muss man aber dazu sagen, daß sich bei dieser Methode die Warscheinlichkeiten stark nach oben verlagern.
Und da würde mir auf anhieb nichts einfallen um den "verschobenen" Zufall wieder gleichmäßig hinzu bekommen
Die Disskusion hatten wir hier schon ein paar mal: Wenn rand() gleichverteilte
Werte auf dem Intervall [0, 2^16-1] liefert, dann liefert (rand() << 16) + rand()
auf [0, 2^32-1] auch gleichverteilte Ergebnisse.Und warum machst du keine Bitshifts?
-
Es ist doch egal ob ich es per bitshiftslöse oder per potenzen...
Fakt ist, daß Du eine ungleichmäßige verteilung in die oberen Bereiche hast!Denn Bei einem Würfel (anzahl der Möglichkeiten ist überschaubarer, Bereich 0 bis 5) den Du mal so ansetzt:
erg=würfel1+Würfel2*6
Das niedrigst mögliche wäre 0, und das höchst mögliche 35. Zeigen beide Würfel eine 1 wären wir schon bei 7! Also wo ist da eine Gleichmäßigkeit?
-
NobbZ schrieb:
Das niedrigst mögliche wäre 0, und das höchst mögliche 35. Zeigen beide Würfel eine 1 wären wir schon bei 7! Also wo ist da eine Gleichmäßigkeit?
wo ist die ungleichmäßigkeit? kann deinem beweis nicht folgen. mach das mal nachvollziehbar.
-
Ich werd mal eine Verteilung hergeben und ein Bild davon auf meinen Webspace laden... dauert nur ne weile
*edit*
Ja OK gebe mich geschlagen... Ist tatsächlich keine Verschiebung nach Oben. Im nachhinein ist mir auch klar warum. Hatte es mit 2 Würfel nach dem Motto Wurfel+wurfel verwechselt wo man ja eindeutig ne Verschiebung um den 7ner Bereich hat
-
NobbZ schrieb:
*edit*
Hatte es mit 2 Würfel nach dem Motto Wurfel+wurfel verwechselt wo man ja eindeutig ne Verschiebung um den 7ner Bereich hatUnd eben dieses Problem umgehst du ja gerade durch die Shifts.
-
Die Frage ist, ob der Zufallsgenerator so gut ist, daß die Zahlen auch noch zufällig sind, wenn ich immer 4 Stück zusammenpacke. Möglicherweise ist, wenn die ersten 3 gezogen sind die 4te auf grund des Generators schon mit hoher Wahrscheinlichkeit eine bestimmte Zahl.
-
Jester schrieb:
Die Frage ist, ob der Zufallsgenerator so gut ist, daß die Zahlen auch noch zufällig sind, wenn ich immer 4 Stück zusammenpacke. Möglicherweise ist, wenn die ersten 3 gezogen sind die 4te auf grund des Generators schon mit hoher Wahrscheinlichkeit eine bestimmte Zahl.
guter punkt.
der late rand() war mit nem wackelnden bit am ende behaftet. als man noch intern mit 16 bit rechnete. heute hat jedes rand inter 32 bit und die niederwertigen 17 oder so fliegen raus.//mögliche moderne implementierung static int x=WIRREEZAHL; int rand() { x=komplizierteFormel(x); return x>>17; }
wärend x noch nen sauberen wackler im letzen bit hat, bemerkt keine benutzer von rand() noch was.