Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2010, 06:35   #1
Radiy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 10
По умолчанию Вихрь Мерсенна

Как осуществить в Delphi вихрь Мерсенна?
Radiy вне форума Ответить с цитированием
Старый 22.10.2010, 07:13   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Изучив соответсвующую литературу. А литературы полно, просто надо читать . Если хотите что-то более конретное - предложите цену.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 22.10.2010, 08:07   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот чтоб сутра мозги размять попробовал слизать один пример с Си
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.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа тестирования произвольных чисел Мерсенна (2^p-1) метода Люка-Лемера Виктор Смирнов Софт 11 21.04.2012 20:13