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 - cs/Class1.cs:
//generowanie liczb pseudolosowych //generator LFG - Lagged Fibonacci Generator //Ogolniony Generator Fibonacci'ego //www.algorytm.org (c) 2008 Tomasz Lubinski using System; namespace LFG { /// <summary> /// generowanie liczb pseudolosowych /// generator LFG - Lagged Fibonacci Generator /// Ogolniony Generator Fibonacci'ego /// www.algorytm.org (c) 2008 Tomasz Lubinski /// </summary> class Class1 { /* Definicje wspolczynnikow j, k oraz m */ private const int j = 22; private const int k = 43; private const ulong m = ((ulong)2 << 31); /* 2^32 */ /* Definicja wspolczynnika a dla generatora LCG dla zainicjowania tablicy */ private const ulong a = 69069; /* Tablica x - rejestr cykliczny oraz jej aktualny wskaznik */ private static ulong[] x = new ulong[k]; private static int i; /// <summary> /// 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 /// </summary> /// <param name="seed">Wartosc ziarna</param> public static void initX(ulong seed) { x[0] = seed; for (int ii=1; ii<k; ii++) x[ii] = (a*x[ii-1]) % m; i = 0; } /* Generator ALFG */ public static ulong genRandALFG() { ulong result; x[i] = (x[(k + i - j) % k] + x[i]) % m; result = x[i]; i = (i + 1) % k; return result; } /* Generator MLFG */ public static ulong genRandMLFG() { ulong result; x[i] = (x[(k + i - j) % k] * x[i]) % m; result = x[i]; i = (i + 1) % k; return result; } /* Generator TGFSR */ public static ulong genRandTGFSR() { ulong result; x[i] = (x[(k + i - j) % k] ^ x[i]) % m; result = x[i]; i = (i + 1) % k; return result; } /// <summary> /// generowanie liczb pseudolosowych /// generator LFG /// </summary> [STAThread] static void Main(string[] args) { int ii, n, g; ulong seed; Console.WriteLine("Podaj wartosc ziarna (seed)"); seed = ulong.Parse(Console.ReadLine()); Console.WriteLine("Podaj ile liczb pseudolosowych wylosowac"); n = int.Parse(Console.ReadLine()); Console.WriteLine("Podaj, ktory generator uzyc:"); Console.WriteLine("1-ALFG - Addytywny Opozniony Generator Fibonacciego"); Console.WriteLine("2-MLFG - Multiplikatywny Opozniony Generator Fibonacciego"); Console.WriteLine("3-TGFSR - Dwupunktowy uogolniony rejestr przesuwny ze sprzezeniem zwrotnym"); g = int.Parse(Console.ReadLine()); initX(seed); switch (g) { case 1: for (ii=0; ii<n; ii++) Console.WriteLine(genRandALFG()); break; case 2: for (ii=0; ii<n; ii++) Console.WriteLine(genRandMLFG()); break; case 3: for (ii=0; ii<n; ii++) Console.WriteLine(genRandTGFSR()); break; } } } }