Funkcje generatora liczb pseudolosowych
michalkopacz
Spis treści
1. Wstęp
2. Przegląd funkcji
2.1 Procedura Randomize
2.2 Zmienna RandSeed
2.3 Funkcja Random
2.4 Funkcja RandG
2.5 Funkcja RandomFrom
2.6 Funkcja RandomRange
Liczby losowe otrzymywane przy wykorzystaniu różnego rodzaju numerycznych programów komputerowych nie są w ścisłym tego słowa znaczeniu liczbami całkowicie losowymi (przypadkowymi). Z tego względu w wielu publikacjach określa się je mianem liczb pseudolosowych. Generatory liczb pseudolosowych są obecnie często wykorzystywanymi narzędziami w wielu gałęziach nauki i techniki, takich jak: matematyka, ekonomia, chemia, fizyka, socjologia, inżynieria materiałowa.
Delphi używa pseudolosowego generatora liczb o cyklu 2^32. Generator tego typu spełnia wymagania niezbędne przy prostych symulacjach, gdzie potrzebujemy wygenerować odpowiednie liczby z relatywnie niezbyt dużego przedziału zmienności.
2. Przegląd funkcji
2.1 Procedura Randomize
Moduł:
System
Definicja:
procedure Randomize;
Opis:
Procedura <b>Randomize</b> służy do zainicjowania generatora liczb pseudolosowych. Procedura ta powinna być wywołana tylko raz na początku pracy programu (przed wywołaniem jakiejkolwiek funkcji generatora liczb pseudolosowych). <b>Randomize</b> przypisuje wartość zmiennej <b>RandSeed</b> na podstawie czasu dnia. W MS Windows przypisania takiego dokonuje się poprzez rekord<b> SystemTime</b>, zaś w Linuksie bezpośrednio korzystając z funkcji <b>_time</b>. Poniżej znajduje się listing tej procedury, zdefiniowanej w module <b>System</b>:
Listing 1 Procedura Randomize
procedure Randomize;
{$IFDEF LINUX}
begin
RandSeed := _time(nil);
{$ENDIF}
{$IFDEF MSWINDOWS}
var
systemTime :
record
wYear : Word;
wMonth : Word;
wDayOfWeek : Word;
wDay : Word;
wHour : Word;
wMinute : Word;
wSecond : Word;
wMilliSeconds: Word;
reserved : array [0..7] of char;
end;
asm
LEA EAX,systemTime
PUSH EAX
CALL GetSystemTime
MOVZX EAX,systemTime.wHour
IMUL EAX,60
ADD AX,systemTime.wMinute // sum = hours * 60 + minutes
IMUL EAX,60
XOR EDX,EDX
MOV DX,systemTime.wSecond
ADD EAX,EDX // sum = sum * 60 + seconds
IMUL EAX,1000
MOV DX,systemTime.wMilliSeconds
ADD EAX,EDX // sum = sum * 1000 + milliseconds
MOV RandSeed,EAX
{$ENDIF}
end;
2.2 Zmienna RandSeed
Moduł:
System
Definicja:
var RandSeed: LongInt = 0;
Opis:
Wartość zmiennej <b>RandSeed </b>jest wykorzystywana przez funkcje generatora liczb pseudolosowych. Przypisanie wartości zmiennej <b>RandSeed</b> następuję poprzez wywołanie procedury <b>Randomize</b>. Istnieje również możliwość bezpośredniego przypisania wartości tej zmiennej przez programistę.
Moduł:
System
Definicja:
function Random [ ( Range: Integer) ];
Opis:
Funkcja <b>Random</b> zwraca liczbę pseudolosową mieszczącą się w przedziale <b><0; Range)</b>. Jeżeli parametr <b>Range</b> nie zostanie podany podczas wywoływania funkcji, zwróci ona wtedy liczbę z przedziału <b><0; 1)</b>. Przed wywołaniem funkcji <b>Random</b> należy zainicjować generator liczb pseudolosowych (patrz ? <b>procedura Randomize</b>)
Moduł:
Math
Definicja:
function RandG(Mean, StdDev: Extended): Extended;
Opis:
Funkcja <b>RandG</b> reprezentuje generator liczb pseudolosowych o rozkładzie Gaussa wokół wartości średniej <b>Mean</b>. Parametr <b>StdDev</b> jest odchyleniem standardowym generowanych liczb od wartości średniej.
Listing 2 Funkcja RandG
function RandG(Mean, StdDev: Extended): Extended;
var
U1, S2: Extended;
begin
repeat
U1 := 2*Random - 1;
S2 := Sqr(U1) + Sqr(2*Random-1);
until S2 < 1;
Result := Sqrt(-2*Ln(S2)/S2) * U1 * StdDev + Mean;
end;
2.5 Funkcja RandomFrom
Moduł:
Math
Definicja:
function RandomFrom(const AValues: array of Double): Double;
overload;
function RandomFrom(const AValues: array of Integer):
Integer; overload;
function RandomFrom(const AValues: array of Int64): Int64;
overload;
Opis:
Funkcja<b> RandomFrom</b> zwraca losowo wybrany element tablicy otwartej, podanej jako parametr <b>AValues</b>. Ponieważ <b>RandomFrom</b> deklarowana jest jako funkcja przeładowana (przeciążona), musimy jawnie wskazać kompilatorowi, która z jej wersji powinna zostać wykonana. Pamiętajmy również o zainicjowaniu generatora liczb pseudolosowych.
Listing 3 Funkcja RandomFrom
function RandomFrom(const AValues: array of Integer): Integer;
begin
Result := AValues[Random(High(AValues) + 1)];
end;
function RandomFrom(const AValues: array of Int64): Int64;
begin
Result := AValues[Random(High(AValues) + 1)];
end;
function RandomFrom(const AValues: array of Double): Double;
begin
Result := AValues[Random(High(AValues) + 1)];
end;
Moduł:
Math
Definicja:
function RandomRange(const AFrom, ATo: Integer): Integer;
Opis:
Funkcja<b> RandomRange</b> zwraca liczbę pseudolosową zawierającą się w przedziale lewostronnie domkniętym <b><AFrom; ATo)</b>.
Listing 4 Funkcja RandomRange
function RandomRange(const AFrom, ATo: Integer): Integer;
begin
if AFrom > ATo then
Result := Random(AFrom - ATo) + ATo
else
Result := Random(ATo - AFrom) + AFrom;
end;
Michał Kopacz
</p>
Przydaloby się trochę nad formatowaniem popracować - nagłówki jako
/
i spis treści wygenerować za pomocą 1 /
.</p>
Już z helpa można się więcej dowiedzieć. Ale za dobre chęci nie dam "buta".