Prírodou inšpirované algoritmy

študijné materiály pre projekt mobilnej triedy umelej inteligencie

Späť ku kurzom triedy
Obsah
Trieda Random
Požívateľské generovanie pseudonáhodných čísel



Ostatné kapitoly
Swarm
RePast
LEM
SDML
Eos
DDLab


Tutoriály
 Celulárne automaty
 Morfogenéza
 Simulátory
 Evolučné algoritmy
 Chaos
 Roboty
 Rôzne


Trieda Random

Trieda uchicago.src.sim.util.Random poskytuje pre RePast štandardný generátor pseudonáhodných čísel. Random zapuzdruje Colt knižnice generátorov pseudonáhodných čísel v jednej triede. Distribúcie generovaných hodnôt sú implementované ako statické premenné. Zámery na to boli dva: poskytnúť jednoduchý prístup k týmto distribúciám a čo je dôležitejšie, uistiť sa, ža každá distribúcia používa rovnaký prúd pseudonáhodných čísel, čo dovoľuje jednoduchú opakovateľnosť správania sa generátora pseudonáhodných čísel.

Random obsahuje množstvo distribúcií pseudonáhodných čísel ako statické premenné rovnako ako niekoľko next metód na získanie nasledujúcje pseudonáhodnej hodnoty z distribúcie. Pred použitím nejakej inštancie premennej distribúcie, tieto distribúcie musia byť vytvorené príslušnou create metódou:


// initialize Random.uniform Random.createUniform(); // Random.uniform is now initialized and can be used. int index = Random.uniform.getNextIntFromTo(0, 100);


Toto vytvorí uniformnú distribúciu z ktorej bude čerpať pseudonáhodné čísla. Môžeme získavať pseudonáhodné čísla z tejto distribúcie použitím príslušných metód. O podrobnostiach o týchto metódach viď dokumentáciu ku Colt balíku cern.jet.random. Aktuálny generátor pseudonáhodných čísel je štandardne inicializovaný pred použitím aktuálnym časom (timestamp). Nižšie je uvedené viac detailov o inicializovaní generátora.

Raz vytvorené distribúci môže byť použitá kdekoľvek v našom kóde prostredníctvom použitia statických premenných triedy Random. Napríklad, ak vytvoríme uniformnú distribúciu v metóde begin() nášho modelu, môžeme aj v kóde agenta pristupovať k tejto uniformnej distribúcii pomocou Random.uniform. Táto premenná môže byť vždy referencovaná ako Random._distribution_name_, ale nemôže byť použitá na pravej strane priradenia. Takéto priradenie by mohlo viesť k nepredpovedateľnému správaniu. Použitie je nasledovné:


int index = Random.uniform.nextIntFromTo(0, 10);

a nikdy nie takéto:

Uniform myUniform = Random.uniform; // This is dangerous. Don't do it!!! ...

int index = myUniform.nextIntFromTo(0, 10);


Všetky distribúcie v triede Random až na jednu sú z knižníc Colt. Mená statických premenných korešpondujú s colt objektom malým začiatočným písmenom. Napríklad, distribúcia cern.jet.Random.Zeta je Radnom.zeta. Metódy next sú použiteľné také, aké sú. Napríklad:

double s = Random.nextCauchy();

vráti ďalšiu hodnotu z Cauchyho distribúcie.

Vo všetkých prípadoch distribúcie používajú Mersenne Twister ako zdroj pseudonáhodných čísel. Mersenne Twister je vo všeobecnosti dobrý generátor pre simulácie, pretože má extrémne vysokú periódu. Tento generátor je inicializovaný aktuálnym časom (timestamp). Akokoľvek, trieda Random umožňuje nastviť inicializačnú hodnotu. Inicializačná hodnota sa nastavuje metódou Random.setSeed(), ktorá vytvorí nový Mersenne Twister generátor zo špecifikovanou inicializačnou hodnotou a zruší platnosť všetkých dovtedy vytvorených distribúcií. Ak chcete používať distribúciu potom, ako bola nastavená inicializačná konštanta, musíte ju vytvoriť ako bolo opísané vyššie. A preto, správny je nasledujúci kód:


Random.createUniform(); int index = Random.uniform.nextIntFromTo(1, 10); ... Random.setSeed(1L); Random.createUniform(); ... intindex = Random.uniform.nextIntFromTo(1, 10);

ale nie tento:

Random.createUniform(); int index = Random.uniform.nextIntFromTo(1, 10); ... Random.setSeed(1L); ... int index = Random.uniform.nextIntFromTo(1, 10); // This won't work


Pripomeňme, že trieda Random štandardne vytvorí generátor inicializovaný aktuálnym časom, ak explicitne nenastavíme vlastnú inicializačnú hodnotu.

Hore
Kontakt: Marek Bundzel