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 - 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());
}
}
}