algorytm.org

Implementacja w C/C++



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 C/C++
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.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;
}
Dodaj komentarz