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 AWCG (Generator Dodawanie Z Przeniesieniem) - 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.

awcg.c:
//generowanie liczb pseudolosowych
//generator AWCG - Add With Carry Generator
//Generator Dodawanie Z Przeniesieniem
//www.algorytm.org (c) 2008 Tomasz Lubinski

#include "stdio.h"

/* Definicje wspolczynnikow j, k oraz m */
#define J 22
#define K 43
#define M 0xFFFFFFFBul /* 2^32-5 */


/* 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;
/* Wartosc przeniesienia c */
unsigned long long c;

/* Zainicjuj tablice X - uzyj gneratora LCG o wspolczynnikach:
m = 2^32-5, 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;
   c = 0;
}

/* Generator AWCG */
unsigned long long genRand()
{
   unsigned long long result;

   result = (x[(K + i - J) % K] + x[i] + c);
   if (result < M)
   {
      c = 0;
   }
   else
   {
      result -= M;
      c = 1;
   }

   x[i] = result;
   i = (i + 1) % K;

   return result;
}

int main()
{
   int j, n;
   unsigned long long seed;

   printf("Podaj wartosc poczatkowa ziarna (seed)\n");
   scanf("%Ld", &seed);

   printf("Podaj ile liczb pseudolosowych wylosowac\n");
   scanf("%d", &n);

   initX(seed);
   for (j=0; j<n; j++)
      printf("%Ld\n", genRand());

   return 0;
}
Dodaj komentarz