Последние записи
- Как запустить программу указанную в Edit.Text
- Скачать файл с использованием потока
- Поиск слова в Memo
- Распаковщик формата .img из GTA San Andreas
- Подсчет количества повторяющихся букв в файле
- Простейший скрипт загрузки картинки с помощью php
- Рассылка. Выпуск 154
- Получение картинки с веб-камеры
- Скопировать определённый кусок image
- Сделать printscreen экрана и сохранить
26th
Окт
Как осуществить в Delphi вихрь Мерсенна?
Posted by Chas under Пост-обзор
Вот чтоб сутра мозги размять попробовал слизать один пример с Си
http://www.math.sci.hiroshima-u.ac.j…ES/mt19937ar.c
{$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.

