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


1. Wstęp

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ę.

2.3 Funkcja Random

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>)

2.4 Funkcja RandG

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; 

2.6 Funkcja RandomRange

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>

2 komentarzy

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".