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.java:
//generowanie liczb pseudolosowych //generator LFG - Lagged Fibonacci Generator //Opóźniony Generator Fibonacci'ego //www.algorytm.org (c) 2008 Tomasz Lubinski public class LFG { /* Definicje wspolczynnikow j, k oraz m */ private static final int j = 22; private static final int k = 43; private static final long m = ((long)2 << 31); /* 2^32 */ /* Definicja wspolczynnika a dla generatora LCG dla zainicjowania tablicy */ private static final long a = 69069; /* Tablica x - rejestr cykliczny oraz jej aktualny wskaznik */ private static long x[] = new long[k]; private static int i; /* 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 */ public static void initX(long seed) { x[0] = seed; for (int ii=1; ii<k; ii++) x[ii] = (a*x[ii-1]) % m; i = 0; } //Calculate a*x mod m private static long mult(long a, long x, long m) { long b,n,r; r = 0; n = 1; b = 1; while (n <= 64) { if ((a & b) != 0) r = (r + x) % m; x = (x + x) % m; b *= 2; n++; } return r; } /* Generator ALFG */ public static long genRandALFG() { long result; x[i] = (x[(k + i - j) % k] + x[i]) % m; result = x[i]; i = (i + 1) % k; return result; } /* Generator MLFG */ public static long genRandMLFG() { long result; x[i] = mult(x[(k + i - j) % k], x[i], m); result = x[i]; i = (i + 1) % k; return result; } /* Generator TGFSR */ public static long genRandTGFSR() { long result; x[i] = (x[(k + i - j) % k] ^ x[i]) % m; result = x[i]; i = (i + 1) % k; return result; } /** * generowanie liczb pseudolosowych * generator LFG * www.algorytm.org (c) 2008 Tomasz Lubinski */ public static void main(String[] args) { int ii, n, g; long seed; System.out.println("Podaj wartosc poczatkowa ziarna (seed)"); seed = Console.readLong(""); System.out.println("Podaj ile liczb pseudolosowych wylosowac"); n = Console.readInt(""); System.out.println("Podaj, ktory generator uzyc:"); System.out.println("1-ALFG - Addytywny Opozniony Generator Fibonacciego"); System.out.println("2-MLFG - Multiplikatywny Opozniony Generator Fibonacciego"); System.out.println("3-TGFSR - Dwupunktowy uogolniony rejestr przesuwny ze sprzezeniem zwrotnym"); g = Console.readInt(""); initX(seed); switch (g) { case 1: for (ii=0; ii<n; ii++) System.out.println(genRandALFG()); break; case 2: for (ii=0; ii<n; ii++) System.out.println(genRandMLFG()); break; case 3: for (ii=0; ii<n; ii++) System.out.println(genRandTGFSR()); break; } } }