Ocena użytkownikóww: ***** / 1
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.
swbg.c:
//generowanie liczb pseudolosowych
//generator SWBG - Subtract With Borrow Generator
//Generator Odejmowanie Z Pożyczką
//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 pozyczki 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 SWBG */
unsigned long long genRand()
{
unsigned long long result;
if (x[(K + i - J) % K] >= x[i] + c)
{
x[i] = x[(K + i - J) % K] - x[i] - c;
c = 0;
}
else
{
x[i] = M - ((x[i] + c) - x[(K + i - J) % K]);
c = 1;
}
result = x[i];
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;
}