Thema: Delphi Random() in PurePascal

Einzelnen Beitrag anzeigen

gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#7

Re: Random() in PurePascal

  Alt 15. Mai 2009, 19:48
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
  Mit Zitat antworten Zitat