algorytm.org

Implementacja w Java



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 Java
Ocena użytkownikóww: *****  / 2
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.java:
//generowanie liczb pseudolosowych
//generator LFG - Lagged Fibonacci Generator
//Opóźniony Generator Fibonacci'ego
//www.algorytm.org (c) 2008 Tomasz Lubinski

public class LFG {

	/* Definicje wspolczynnikow j, k oraz m */
	private static final int j = 22;
	private static final int k = 43;
	private static final long m = ((long)2 << 31); /* 2^32 */
	
	/* Definicja wspolczynnika a dla generatora LCG dla zainicjowania tablicy */
	private static final long a = 69069;
	
	/* Tablica x - rejestr cykliczny oraz jej aktualny wskaznik */
	private static long x[] = new long[k];
	private static int 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 */
	public static void initX(long seed)
	{   
	   x[0] = seed;
	   for (int ii=1; ii<k; ii++)
	      x[ii] = (a*x[ii-1]) % m;

	   i = 0;
	}	
	
	//Calculate a*x mod m
	private static long mult(long a, long  x, long m) {
	   long b,n,r;

	   r = 0;
	   n = 1;
	   b = 1;
	   while (n <= 64) {
	      if ((a & b) != 0)
	         r = (r + x) % m;
	      x = (x + x) % m;
	      b *= 2;
	      n++;
	   }

	   return r;
	}	

	/* Generator ALFG */
	public static long genRandALFG()
	{
	    long result;

	    x[i] = (x[(k + i - j) % k] + x[i]) % m;
	    result = x[i];
	    i = (i + 1) % k;

	    return result;
	}

	/* Generator MLFG */
	public static long genRandMLFG()
	{
	    long result;

	    x[i] = mult(x[(k + i - j) % k], x[i], m);
	    result = x[i];
	    i = (i + 1) % k;

	    return result;
	}

	/* Generator TGFSR */
	public static long genRandTGFSR()
	{
	    long result;

	    x[i] = (x[(k + i - j) % k] ^ x[i]) % m;
	    result = x[i];
	    i = (i + 1) % k;

	    return result;
	}

	
	/**
	 * generowanie liczb pseudolosowych
     * generator LFG
     * www.algorytm.org (c) 2008 Tomasz Lubinski
	 */
	public static void main(String[] args) {
		int ii, n, g;
		long seed;

		System.out.println("Podaj wartosc poczatkowa ziarna (seed)");
		seed = Console.readLong("");

		System.out.println("Podaj ile liczb pseudolosowych wylosowac");
		n = Console.readInt("");
		
		System.out.println("Podaj, ktory generator uzyc:");
		System.out.println("1-ALFG - Addytywny Opozniony Generator Fibonacciego");
		System.out.println("2-MLFG - Multiplikatywny Opozniony Generator Fibonacciego");
		System.out.println("3-TGFSR - Dwupunktowy uogolniony rejestr przesuwny ze sprzezeniem zwrotnym");
		g = Console.readInt("");

		initX(seed);
		switch (g)
		{
		   case 1:
		      for (ii=0; ii<n; ii++)
		    	  System.out.println(genRandALFG());
		      break;
		   case 2:
		      for (ii=0; ii<n; ii++)
		    	  System.out.println(genRandMLFG());
		      break;
		   case 3:
		      for (ii=0; ii<n; ii++)
		    	  System.out.println(genRandTGFSR());
		      break;
		} 
	}

}
Dodaj komentarz