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