Meandry losowości

Gdy w zeszłym tygodniu opublikowałem post o przesądach związanych z kostkami do gry odezwał się do mnie znajomy (dzięki Marcin!) i zapytał o to co sądzę o programach do rzucania kostkami i czy ich wykorzystanie nie wykluczy czasem magicznego myślenia o losowości. Long story short – nie. Przykład: gracz będzie wciśkać przycisk losujący w określony sposób uważając, że tylko tak da mu to dobry wynik. A wracając do programów do generowania liczb losowych – mam z nimi jeden problem. Nie dają liczb losowych.

Pseudolosowość

Zróbmy eksperyment myślowy i załóżmy teraz na chwilę, że jesteśmy programistami. Ale tymi pierwszymi programistami, którzy kilkadziesiąt lat temu tworzyli podwaliny pod współczesne języki programowania. Chcielibyśmy napisać generator liczb losowych, ale jak to zrobimy? Nie zamontujemy komputerowi specjalnego ramienia do rzucania kostką. Generator musi być możliwie najszybszy żeby nie spowalniał programów, które będą z niego korzystać.

Aby dobrze zrozumieć sytuację trzeba zadać sobie jeszcze jedno pytanie – po co nam generator liczb losowych? Na pewno nie do gier, bo te pojawiły się później. Losowość jest nam potrzebna do implementacji różnych algorytmów. Algorytmów, czyli swego rodzaju programistycznych przepisów na poradzenie sobie z jakąś sytuacją. Niektóre algorytmy korzystają właśnie z liczb losowych aby uśrednić swoje zachowanie. Nie tyle więc chodzi o prawdziwą losowosć, ale losowość z pewnym rozkładem prawdopodobieństwa. Czyli nie chcemy tu na przykład żeby 100 razy wylosowała się ta sama liczba, ale żeby w tych stu losowaniach każda z liczb z wybranego przedziały występowała tyle samo razy.

Aby to osiągnąć nie potrzebujemy żadnych wysublimowanych technik ani mechanicznych ramion do rzucania kostkami. W każdym komputerze jest już coś, co ciągle zmienia swoją wartość i jest to zegar. Wystarczy wziąć stan zegara, zrobić na nim kilka operacji i już – mamy liczbę losową. I dlatego właśnie liczby generowane przez komputery to liczby pseudolosowe.

Test

Aby wam pokazać, w jaki sposób kształtują się wyniki w generatorze liczb pseudolosowych napisałem krótki program, który przeprowadza szereg losowań. W poniższej tabelce widzicie jego wyniki. Od razu da się zauważyć, że nawet przy małej liczbie rzutów dość szybko dochodzimy do wartości oczekiwanej dla danej kostki.

k4 k6 k8 k10 k12 k20
Wartość oczekiwana 2,5 3,5 4,5 5,5 6,5 10,5
10 2 3,7 4,5 6,2 6,1 12,1
100 2.41 3,38 4,49 5,39 6,01 10,58
1000 2.558 3,52 4,575 5,632 6,664 10,358
10000 2.5191 3,4699 4,4536 5,5895 6,5115 10,5023

Dla porównania rzuciłem 100 razy moimi k10-kami. Do rzucania użyłem 20 kostek, więc nawet jeśli część z nich miała zaburzoną losowość, to reszta powinna podtrzymać średnią. Mój wynik to 6,12. Widać jak znacząco różni się on od wyników dawanych przez program komputerowy. Oczywiście, za każdą kolejną próbą ten wynik może być zupełnie różny, może być nawet tak, że sto razy wyrzucę 10. To w końcu kostki – wszystko się może zdarzyć.

random.org

„Ale ale” – zakrzykniecie – „jest przecież random.org!”. Tak, jest random.org. To strona, która pozwala na generowanie „prawdziwszych” liczb losowych. Tyle, ze chciałem zestawić wyniki mojego programu z wynikami z random.org i niestety nie różniły się one zbytnio. Nie twierdzę, że random.org oszukuje, ale możliwe że ich metody po prostu nie działają zbyt dobrze na małych liczbach. Co zatem nam zostaje? Czy do końca świata erpegowcy będą rzucać kostkami, nawet gdy większość ludzkości zapomni o tak prymitywnych metodach na generowanie liczb losowych?

Inne możliwości

W tej chwili istnieją generatory losowe, które dają całkiem dobre wyniki, ale niestety są to generatory haseł. Korzystaja one z odstępów czasowych między wciśnięciami klawiszy, intensywności pracy z dyskiem albo innych fizycznych czynników. Tak samo można pomyśleć o generatorze, którzy zbierałby dane z żyroskopu w smartfonie albo analizował rozkład kolorów odbieranych przez kamerę. Wstepne wyszukiwanie tego typu rozwiazań w Internecie nie dało mi żandych rezultatów, więc jeśli jesteś deweloperem aplikacji mobilnych – to nisza dla Ciebie :D Chętnie zapłacę dychę za aplikację do rzucania kostkami dającą losowość zbliżoną do prawdziwych kostek. Póki co pozostaje opakować nasze ukochane wielościany w ładne etui albo sakwę i nosić je wszędzie ze sobą.

Czy to źle?

Odpowiedź na to, czy mimo wszystko warto zaufać generatorom i dice rollerom zostawiam wam. W mojej notce starałem się podejść do tematu teoretycznie i analitycznie. Praktyka może być zupełnie inna. W końcu cały czas ludzie grają przez internet, korzystając właśnie z generatorów rzutów i jakoś żyją, więc może nie jest to do końca takie złe?

  • „Wstepne wyszukiwanie tego typu rozwiazań w Internecie nie dało mi żandych rezultatów,” – use the /dev/random Luke. Pingwinowy generator właśnie jest w taki sposób zaimplementowany, że zbiera entropię z różnych fajnych źródeł. Myślę że dzisiejsze generatory komputerowe mogą dawać nawet lepszej klasy losowość niż typowe plastikowe kości (podatne na krzywy odlew, odpryski, ścieranie itp) jakie używamy na stole.

    Za to zaburzoną losowość mają wszystkie sprzęty embedded, komórki i maszyny wirtualne. Chociaż to wymagałoby dokładniejszego zbadania, bo to info sprzed paru lat, a być może dzisiejszy /dev/random (na tych urządzeniach) i z tym sobie poradzi.

    • Myślę, że mój program odpalony na Linuksie korzystał z /dev/urandom :)

      Co do lepszej klasy losowości – w takim razie wszystko sprowadza się do wiary w słuszność jednego lub drugiego rozwiązania :) Bo nie rzucisz swoimi kostkami milion razy żeby przetestować ich losowość z wysoką dokładnością.

      • urandom jest mniej prawdziwy, przy braku entropii po prostu daje zwyczajną pseudolosowość. random za to czeka z odpowiedzią aż uzbiera odpowiednio dużo entropii. Polecam manpage, tam jest napisane, który co i jak.

        Z resztą, ja ogółem jestem zdania, że dla RPG nie ma to większego znaczenia. Jeśli ktoś kombinował z kośćmi to jest to wyraźnie widoczne, wszystko inne jest mi obojętne. Niedawno jak prowadziłem na roll20, 3 graczom w ciągu 15 minut wyleciało w sumie jakieś 8 jedynek i dwójek na 1k20. Można jedynie powiedzieć „statystyka jest dziwką” :-).

  • Shockwave

    Hmm, być może teraz już wiem dlaczego zawsze byłem sceptyczny wobec elektronicznych randomizerów. Widzę, że nawet najlepsze dostępne amatorom programy losujące i tak posiłkują się jakimiś źródłami, które wprowadzają mniejszą lub większą stagnację w ich „losowości”. Kości nie są idealne, ale nad tym można pracować, np. obserwując wyniki na ulubionych kostkach i eliminując zbyt podejrzane (choćby próba soli).

    Technologia to cudowna rzecz, ale są rejony gdzie wciąż klęka z pokorą przed starymi ścieżkami i będzie klęczeć jeszcze przez długi czas.


Notice: Korzystanie z get_currentuserinfo uznawane jest za przestarzałe od wersji 4.5.0! Zamiast tego użyj wp_get_current_user(). in /home/deploy/radowit.net/radowit.net/cgi/wp-includes/functions.php on line 3830