Bei der ganzen Diskussion mit EBX etc ist doch etwas untergangen, warum der Ausgangscode nicht funktioniert und warum nicht mod benutzt wird. Zum ersten war himitsu ziemlich nahe dran. Hier ein Delphiprogramm, daß exakt random reproduziert (zumindest bis D10):
Delphi-Quellcode:
program rt;
{$apptype console}
{$q-,r-}
uses
windows,sysutils;
var
myrandseed: cardinal;
function myrandom(range: cardinal): cardinal;
begin
myrandseed := myrandseed * $08088405 + 1;
result := (int64(range) * myrandseed) shr 32;
end;
var
k: integer;
r1,r2: cardinal;
begin
myrandseed := randseed;
for k:=1 to 10 do begin
r1 := random(100000);
r2 := myrandom(100000);
writeln(r1:10, r2:10, myrandseed mod 2:4, myrandseed mod 4:4)
end;
readln;
end.
Ausgabe ist:
Code:
. 0 0 1 1
. 3137 3137 0 2
. 86104 86104 1 3
. 20258 20258 0 0
. 27292 27292 1 1
. 67165 67165 0 2
. 31869 31869 1 3
. 16179 16179 0 0
. 37223 37223 1 1
. 42567 42567 0 2
Die letzen beiden Spalten zeigen, warum mod nicht 'gut' ist: die unteren Bits sind halt nicht besonders zufällig :)
Selbst random und die hohen Bits haben eine klein Bias, aber für den Hausgebrauch reichts (für wissenschaftliche Zwecke ist die Periode von random eh zu klein, und für Kryptographie sowieso völlig ungeignet).
Gammatester