algorytm.org

Implementacja w 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#
Ocena użytkownikóww: *****  / 3
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 - cs/Class1.cs:
//generowanie liczb pseudolosowych
//generator LFG - Lagged Fibonacci Generator
//Ogolniony Generator Fibonacci'ego
//www.algorytm.org (c) 2008 Tomasz Lubinski

using System;

namespace LFG
{
	/// <summary>
	/// generowanie liczb pseudolosowych
	/// generator LFG - Lagged Fibonacci Generator
	/// Ogolniony Generator Fibonacci'ego
	/// www.algorytm.org (c) 2008 Tomasz Lubinski
	/// </summary>
	class Class1
	{
		/* Definicje wspolczynnikow j, k oraz m */
		private const int j = 22;
		private const int k = 43;
		private const ulong m = ((ulong)2 << 31); /* 2^32 */ 

		/* Definicja wspolczynnika a dla generatora LCG dla zainicjowania tablicy */
		private const ulong a = 69069;
	
		/* Tablica x - rejestr cykliczny oraz jej aktualny wskaznik */
		private static ulong[] x = new ulong[k];
		private static int i;

		/// <summary>
		/// 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
		/// </summary>
		/// <param name="seed">Wartosc ziarna</param>
		public static void initX(ulong seed)
		{   
			x[0] = seed;
			for (int ii=1; ii<k; ii++)
				x[ii] = (a*x[ii-1]) % m;

			i = 0;
		}

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

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

			return result;
		}

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

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

			return result;
		}

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

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

			return result;
		}


		/// <summary>
		/// generowanie liczb pseudolosowych
		/// generator LFG
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			int ii, n, g;
			ulong seed;

			Console.WriteLine("Podaj wartosc ziarna (seed)");
			seed = ulong.Parse(Console.ReadLine());

			Console.WriteLine("Podaj ile liczb pseudolosowych wylosowac");
			n = int.Parse(Console.ReadLine());

			Console.WriteLine("Podaj, ktory generator uzyc:");
			Console.WriteLine("1-ALFG - Addytywny Opozniony Generator Fibonacciego");
			Console.WriteLine("2-MLFG - Multiplikatywny Opozniony Generator Fibonacciego");
			Console.WriteLine("3-TGFSR - Dwupunktowy uogolniony rejestr przesuwny ze sprzezeniem zwrotnym");
			g = int.Parse(Console.ReadLine());

			initX(seed);
			switch (g)
			{
				case 1:
				  for (ii=0; ii<n; ii++)
		    		Console.WriteLine(genRandALFG());
					break;
				case 2:
					for (ii=0; ii<n; ii++)
		    			Console.WriteLine(genRandMLFG());
					break;
				case 3:
					for (ii=0; ii<n; ii++)
		    			Console.WriteLine(genRandTGFSR());
					break;
			} 
		}
	}
}
Dodaj komentarz