26th
Окт

Как осуществить в Delphi вихрь Мерсенна?

Posted by Chas under Пост-обзор

Вот чтоб сутра мозги размять попробовал слизать один пример с Си

http://www.math.sci.hiroshima-u.ac.j…ES/mt19937ar.c

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const n=624; m=397;
 UPPER_MASK=$80000000;
 LOWER_MASK=$7fffffff;

var mt:array[0..n] of Cardinal;
    mti:Integer;
procedure randinit(i:Cardinal);
var k:Integer;
begin
 mt[0]:=i and $ffffffff;
 for k:=1 to n do begin
  mt[k]:=(1812433253 * (mt[k-1] xor (mt[k-1] shr 30)) + k);
  mt[k]:=mt[k] and $ffffffff;
 end;
 mti:=0;
end;

function rand:Cardinal;
var y:Cardinal;  kk:integer;
 mag01:Array[0..1] of Cardinal;
begin
    mag01[0]:=0;mag01[1]:=$9908b0df;
    if (mti >= N) then begin
        if (mti = N+1) then    randinit(5489);
        kk:=0; while kk<=(N-M) do begin
            y := (mt[kk] and UPPER_MASK) or (mt[kk+1] and LOWER_MASK);
            mt[kk] := mt[kk+M] xor (y shr 1) or mag01[y and 1];
           inc(kk);
        end;
        while kk<(N-1) do begin
            y := (mt[kk] and UPPER_MASK) or (mt[kk+1] and LOWER_MASK);
            mt[kk] := mt[kk+(M-N)] or (y shr 1) xor mag01[y and 1];
         inc(kk);
        end;

        y := (mt[N-1]  and UPPER_MASK)or(mt[0] and LOWER_MASK);
        mt[N-1] := mt[M-1] xor (y shr 1) xor mag01[y and 1];

        mti := 0;
    end;
 
    y := mt[mti];inc(mti);

    y := y xor (y shr 11);
    y := y xor ((y shl 7) and $9d2c5680);
    y := y xor ((y shl 15) and $efc60000);
    y := y xor (y shr 18);

    result:=y;
end;
var i:integer;
begin
   randinit(5489);
   for i:=0 to 10 do
    writeln(rand);readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.

Тема на форуме

Похожие статьи