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.c:
//generowanie liczb pseudolosowych
//generator LFG - Lagged Fibonacci Generator
//Opóźniony Generator Fibonacci'ego
//www.algorytm.org (c) 2008 Tomasz Lubinski
#include "stdio.h"
/* Definicje wspolczynnikow j, k oraz m */
#define J 24
#define K 55
#define M 0x100000000ul /* 2^32 */
/* Definicja wspolczynnika a dla generatora LCG dla zainicjowania tablicy */
#define A 69069
/* Tablica x - rejestr cykliczny oraz jej aktualny wskaznik */
unsigned long long x[K];
unsigned long 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 */
void initX(unsigned long long seed)
{
int j;
x[0] = seed;
for (j=1; j<K; j++)
x[j] = (A*x[j-1]) % M;
i = 0;
}
/* Generator ALFG */
unsigned long long genRandALFG()
{
unsigned long long result;
x[i] = (x[(K + i - J) % K] + x[i]) % M;
result = x[i];
i = (i + 1) % K;
return result;
}
/* Generator MLFG */
unsigned long long genRandMLFG()
{
unsigned long long result;
x[i] = (x[(K + i - J) % K] * x[i]) % M;
result = x[i];
i = (i + 1) % K;
return result;
}
/* Generator TGFSR */
unsigned long long genRandTGFSR()
{
unsigned long long result;
x[i] = (x[(K + i - J) % K] ^ x[i]) % M;
result = x[i];
i = (i + 1) % K;
return result;
}
int main()
{
int j, n, g;
unsigned long long seed;
printf("Podaj wartosc poczatkowa ziarna (seed)\n");
scanf("%Ld", &seed);
printf("Podaj ile liczb pseudolosowych wylosowac\n");
scanf("%d", &n);
printf("Podaj, ktory generator uzyc:\n");
printf("1-ALFG - Addytywny Opozniony Generator Fibonacciego\n");
printf("2-MLFG - Multiplikatywny Opozniony Generator Fibonacciego\n");
printf("3-TGFSR - Dwupunktowy uogolniony rejestr przesuwny ze sprzezeniem zwrotnym\n");
scanf("%d", &g);
initX(seed);
switch (g)
{
case 1:
for (j=0; j<n; j++)
printf("%Ld\n", genRandALFG());
break;
case 2:
for (j=0; j<n; j++)
printf("%Ld\n", genRandMLFG());
break;
case 3:
for (j=0; j<n; j++)
printf("%Ld\n", genRandTGFSR());
break;
}
return 0;
}

