Programowanie w języku Delphi » Artykuły

Funkcje generatora liczb pseudolosowych

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 Randomize 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). Randomize przypisuje wartość zmiennej RandSeed na podstawie czasu dnia. W MS Windows przypisania takiego dokonuje się poprzez rekord SystemTime, zaś w Linuksie bezpośrednio korzystając z funkcji _time. Poniżej znajduje się listing tej procedury, zdefiniowanej w module System:

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 RandSeed jest wykorzystywana przez funkcje generatora liczb pseudolosowych. Przypisanie wartości zmiennej RandSeed następuję poprzez wywołanie procedury Randomize. 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 Random zwraca liczbę pseudolosową mieszczącą się w przedziale <0; Range). Jeżeli parametr Range nie zostanie podany podczas wywoływania funkcji, zwróci ona wtedy liczbę z przedziału <0; 1). Przed wywołaniem funkcji Random należy zainicjować generator liczb pseudolosowych (patrz ? procedura Randomize)

2.4 Funkcja RandG

Moduł:
Math

Definicja:
function RandG(Mean, StdDev: Extended): Extended;


Opis:

    Funkcja RandG reprezentuje generator liczb pseudolosowych o rozkładzie Gaussa wokół wartości średniej Mean. Parametr StdDev 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 RandomFrom zwraca losowo wybrany element tablicy otwartej, podanej jako parametr AValues. Ponieważ RandomFrom 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 RandomRange zwraca liczbę pseudolosową zawierającą się w przedziale lewostronnie domkniętym <afrom; ato)</b="ATo)&lt;/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

2 komentarze

Coldpeer 2006-06-04 14:35

Przydaloby się trochę nad formatowaniem popracować - nagłówki jako <h1>/<h2> i spis treści wygenerować za pomocą

Spis treści

.

wotek 2005-09-03 21:21

Już z helpa można się więcej dowiedzieć. Ale za dobre chęci nie dam \"buta\".