algorytm.org

Implementacja w Delphi/Pascal



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Generator LFG (Opóźniony Generator Fibonacci'ego) - Implementacja w Delphi/Pascal
Ocena użytkownikóww: *****  / 1
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 28 września 2008 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

LFG - Delphi/LFG.dpr:
//generowanie liczb pseudolosowych
//generator LFG - Lagged Fibonacci Generator
//Opóźniony Generator Fibonacci'ego
//www.algorytm.org (c) 2008 Tomasz Lubinski

program LFG;
{$APPTYPE CONSOLE}
uses
  SysUtils;

const

// Definicje wspolczynnikow j, k oraz m
J = 24;
K = 55;
M = $100000000;

// Definicja wspolczynnika a dla generatora LCG dla zainicjowania tablicy
A = 69069;

var

x: Array [0 .. K-1] of Int64;
i, ii, g, n : Integer;
seed: Int64;


// Zainicjuj tablice X - uzyj gneratora LCG o wspolczynnikach:
//m = 2^32, a = 69069, c = 0.
//dla takiego generatora wszystkie posrednie wyniki mieszcza sie w 49 bitach
procedure initX(seed: Int64);
var
   j: Integer;
begin

   x[0] := seed;
   for j:=1 to K-1 do
      x[j] := (A*x[j-1]) mod M;

   i := 0;
end;

// Calculate a*x mod m
function Mult(a,x,m : Int64) : Int64;
var b,n,r : Int64;
begin
  r := 0;
  n := 1;
  b := 1;
  while n <= 64 do
  begin
    if a and b <> 0 then
       r := (r + x) mod m;
    x := (x + x) mod m;
    b := 2 * b;
    n := n + 1;
  end;
  Mult := r;
end;


// Generator ALFG
function genRandALFG(): Int64;
begin
    x[i] := (x[(K + i - J) mod K] + x[i]) mod M;
    result := x[i];
    i := (i + 1) mod K;
end;

// Generator MLFG
function genRandMLFG(): Int64;
begin
    x[i] := Mult(x[(K + i - J) mod K], x[i], M);
    result := x[i];
    i := (i + 1) mod K;
end;

// Generator TGFSR
function genRandTGFSR(): Int64;
begin
    x[i] := (x[(K + i - J) mod K] xor x[i]) mod M;
    result := x[i];
    i := (i + 1) mod K;
end;

begin

   writeln('Podaj wartosc poczatkowa ziarna (seed)');
   readln(seed);

   writeln('Podaj ile liczb pseudolosowych wylosowac');
   readln(n);

   writeln('Podaj, ktory generator uzyc:');
   writeln('1-ALFG - Addytywny Opozniony Generator Fibonacciego');
   writeln('2-MLFG - Multiplikatywny Opozniony Generator Fibonacciego');
   writeln('3-TGFSR - Dwupunktowy uogolniony rejestr przesuwny ze sprzezeniem zwrotnym');
   readln(g);

   initX(seed);

   case g of
      1: for ii:=1 to n do
            writeln(genRandALFG());
      2: for ii:=1 to n do
            writeln(genRandMLFG());
      3: for ii:=1 to n do
            writeln(genRandTGFSR());
   end;

end.
Dodaj komentarz