#include /* Parametri LCG-a */ unsigned int LCG_var = 1; // trenutna vrijednost LCG-a /* Parametri LFG-a */ unsigned int LFG_polje[55] = {0}; // polje potrebno za rad LFG-a unsigned int LFG_brojac = 0; // brojac kroz elemente polja /* Parametri hash_rnd-a */ FILE *hash_dat; /* datoteka iz koje ce se citati bitovi iz kojih ce biti generirani pseudoslucajni bitovi */ /* funkcija sndrnd_l vraca slucajni broj tipa int dobiven citanjem podataka s /dev/audio ulaza */ unsigned int sndrnd_l() { FILE *f; unsigned int rez = 0; char x, x1, tmp=127, a ; int i, j; f = fopen("/dev/audio","rb"); for(i=0;i> (rez & 0x1F); // dodatak za povecanje ucestalosti malih brojeva fclose(f); return rez; } /* funkcija sndrnd_ll je analogna funkciji sndrnd_l, osim sto vraca 64 bita, odnosno broj tipa long long */ unsigned long long sndrnd_ll(void) { FILE *f; unsigned long long rez = 0; char x, x1, tmp=127, a ; int i, j; f = fopen("/dev/audio","rb"); for(i=0;i> (rez & 0x3F); // pomak za povecanje ucestalosti malih brojeva fclose(f); return rez; } /* funkcija za inicijalizaciju LCG-a pomocu funkcije sndrnd_l */ void init_LCG() { LCG_var = sndrnd_l(); // neparnost seed-a osigurana } /* funkcija za rucno postavljanje seed-a LCG-a */ void seed_LCG(unsigned int seed) { LCG_var = seed; } /* primjer funkcije LCG(16807, 1, 2^31 - 1, X0) gdje je X0 inicijalno 1, a moze ga se postaviti funkcijom init_LCG ili seed_LCG */ unsigned int LCG() { LCG_var = (16807 * LCG_var + 1) & 0x7fffffff; return LCG_var; } /* funkcija inicijalizacije datoteke koju koristi hash_rnd */ void init_hash_rnd(char * ime) { hash_dat = fopen(ime,"rb"); } /* funkcija zatvaranja datoteke koju koristi hash_rnd */ void stop_hash_rnd() { fclose(hash_dat); } /* funkcija hash_rnd, koja generira slucajnu rijec pretvaranjem parova bitova iz datoteke u bitove u toj rijeci */ unsigned int hash_rnd() { unsigned int rez = 0; short i, j=0; char pod, tmp; for (i = 0; i> 2; j -= 2; i++; } else if (tmp == 2) { // detektirana jedinica, koja se zapisuje u izlaznu rijec rez = rez << 1; rez = rez | 1; pod = pod >> 2; j -= 2; i++; } else { // niti nula ni jedinica se ne zapisuju pod = pod >> 2; j -= 2; } } // rez = rez >> (rez & 0x1F); // pomak za povecanje ucestalosti manjih brojeva return rez; } /* funkcija inicijalizacije pocetnog niza, potrebnog za rad LFG-a */ /* niz se inicijalizira pomocu funkcije sndrnd_l */ void init_LFG() { for (LFG_brojac = 0 ; LFG_brojac < 55 ; LFG_brojac++) LFG_polje[LFG_brojac] = sndrnd_l(); /* da bi jedan od pocetnog niza brojeva sigurno bio neparan */ LFG_polje[24] |= 0x1; } /* rezervna funkcija inicijalizacije LFG-a, koja koristi funkciju hash_rnd */ void h_init_LFG() { for (LFG_brojac = 0 ; LFG_brojac < 55 ; LFG_brojac++) LFG_polje[LFG_brojac] = hash_rnd(); /* da bi jedan od pocetnog niza brojeva sigurno bio neparan */ LFG_polje[24] |= 0x1; } /* funkcija LFG-a , zbraja 24-og i 55-og prethodnika u nizu, dobiveni broj po modulu 0x7fffffff sprema u polje, te ga vraca korisniku */ unsigned int LFG() { unsigned int tmp; LFG_brojac = LFG_brojac%55; LFG_polje[LFG_brojac] = (LFG_polje[LFG_brojac] + LFG_polje[(LFG_brojac - 24 + 55) % 55]) & 0x7fffffff; tmp = LFG_polje[LFG_brojac]; LFG_brojac = (LFG_brojac++) % 55; return tmp; }