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ł: ```delphi System ``` Definicja: ```delphi 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 ```delphi 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ł: ```delphi System ``` Definicja: ```delphi 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ł: ```delphi System ``` Definicja: ```delphi 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ł: ```delphi Math ``` Definicja: ```delphi 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 ```delphi 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ł: ```delphi Math ``` Definicja: ```delphi 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 ```delphi 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ł: ```delphi Math ``` Definicja: ```delphi 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 ```delphi 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 komentarzy

Przydaloby się trochę nad formatowaniem popracować - nagłówki jako

/

i spis treści wygenerować za pomocą 1 /
     1.1 i spis treści wygenerować za pomocą {{CONTENT}}. </p>
. </p>

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