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 SWBG (Generator Odejmowanie Z Pożyczką) - Implementacja w 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.

SWBG - cs/Class1.cs:
//generowanie liczb pseudolosowych
//generator SWBG - Subtract With Borrow Generator
//Generator Odejmowanie Z Pożyczka
//www.algorytm.org (c) 2008 Tomasz Lubinski

using System;

namespace SWBG
{
	/// <summary>
	/// generowanie liczb pseudolosowych
	/// generator SWBG - Subtract With Borrow Generator
	/// Generator Odejmowanie Z Pożyczka
	/// 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) - 5; /* 2^32-5 */

		/* 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;

		/* Wartosc pozyczki c */
		private static ulong c;

		/// <summary>
		/// 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
		/// </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 SWBG */
		public static ulong genRand()
		{
			ulong result = (x[(k + i - j) % k] + x[i] + c);
	   
			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;
		} 


		/// <summary>
		/// generowanie liczb pseudolosowych
		/// generator SWBG
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			int ii, n;
			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());

			initX(seed);

  			for (ii=0; ii<n; ii++)
				Console.WriteLine(genRand());
		}
	}
}
Dodaj komentarz