Jak obiecywałem oto kilka uwag o generowaniu liczb pseudo-losowych przez Mathematica. Przede wszystkim, należy zacząć od odróżnienia dwóch kwestii: generowania liczb pseudo-losowych o rozkładzie równomiernym (uniform distribution) i, używając już takiego generatora, generowania liczb o rozkładzie normalnym. To tym drugim tematem zajmowaliśmy się w zeszłym roku, natomiast mi chodziło o ten pierwszy, kiedy mówiłem o różnych generatorach używanych przez Mathematica. W każdym razie teraz kilka słow o tych pierwszych. Myślę że mogłoby to także być podstawą jakiegoś projektu.

Najważniejszym generatorem w Mathmatica jest "cellular automaton" (CA) generator Wolframa. OPiera się on na jednym automacie komurkowym, kenerowanym w klasyfikacji Wolframa chyba przez regułę 30 (?), w każdym razie jest to opisane w jego książce "A New Kind of Science" która teraz w całości jest dostępna w Internecie pod adresem <http://www.wolframscience.com/nksonline>.

Ten generator jest używany do generowania liczb całkowitych nie większych niż 2^30-1.   

Jest także generator typu subtract-with-borrow (SWB) Marsaglji i Zamana, który chyba jest opisany w książce którą pożyczyłem Panu Adamowi. 

Używane są on w ten sposób. Dle generowania małych liczb całkowitych Mathematica używa CA. 
Dla dużych liczb całkowitych Mathematica używa SWB i CA. SWB generuje za jdnym razem liczby o 31 cyfrach w systemie dwójkowym (kawałki). Dla generowania większej liczby, Mathematica  łączy ile potrzeba liczb 31-kawałkowych generowanych przez SWB a pozostałe kawałki są generowane przez CA. 

Liczby rzeczywiste o wysokiej pracyzji (wszystko co ma więcej niż $MachinePrecision cyfr ($MachinePrecision jest różne dla różnych komputerów, na Macintoszu wynosi 16), są generowane przez CA.

Liczby o precyzji maszynowej (machine precision) , take jakie generuje funkcja Random[], niestety używają algorytmu SWB. 

W roku 1999 po raz pierwszy pojawiły się wyniki testów przeprowadzonych na generatorach przez instytut NIST. Grupa testów która została tam użyta nosi nazwę DIEHARD i była stworzona przez Georga Marsaglia. 

 Okazało się że algorytm SWB nie zdaje dwóch testów. Natomiast CA zdał wszystkie i podobno jest to jedyny algorytm generujący liczby losowe który to osiągnął. Dane na temat testów są chyba na stronie WWW Georga Marsaglia, choć w tej chwili nie mam jej URL-u. 
Potem stworzono jeszcze dwa testy których SWB nie zdał, a CA zdał. Wydawałoby się że należałoby się pozbyć SWB i zastąpić go całkowicie przez CA. Niestety tego dotąd nie zrobiono, chyba po to aby nie stworzyć nowych różnic w różnych odpowiedziach dawanych przez różne wersje Mathematica. 
Zadanie poradzenia sobie z tym problemem pozostawiono więc użytkownikom, którym on zaczyna przeszkadzać (tacy pojawiają się od czasu do czasu, choć nie często).  
Więc, na przykład, aby zastąpić generator Random[], który używa SWB generatorem używającym CA możemy użyć 
konstrukcji:
 
((Random[Integer,2^30-1]/2^30.)+
	Random[Integer,2^30-1])/2^30.

Konstrukcja ta działa bo liczby całkowite o mniej niż 30 kawałkach (bits) są generowane przez CA. 

Pozostaje zadanie jak pozmieniać generatory liczb losowych opartych na innych dystrybucjach, jak na przykład normalnej, a także innych. Należy zrobić to tak aby działało szybko, więc trzeba będzie funkcje kompilować. Można by zrobić to tak jak w książce Shawa, z tym że zamiast funkcji Random[] użyć powyższej modyfikacji. Wydaje mi się to podstawą do interesującego projektu, szczególnie gdyby udało się w ten sposób przepisać także  generatory dla innych dystrybucji które znajdują się w pakietach do statystyki dołączonych do Mathematica. 
Wszystko to wydaje mi się podstawą do interesującego projektu.  

Mam nadzieję że co tu napisałem było choć trochę zrozumiałe i nie całkowicie bezużyteczne.

Andrzej Kozłowski