sens
g/Informatyka

Macie kurwa ciekawostkę: najpopularniejszą chyba implementacją generatora liczb pseudolosowych jest uproszczony liniowy generator kongruencyjny, czyli po prostu rekurencyjna funkcja

x_n+1 = a * x_n + c % m

Jest to stosowane od dawien dawna, aż do dziś, np. w standardowej bibliotece C. Jest to szybkie, efektywne i proste. W latach 60. IBM zaimplementowało wersję z wartościami a=65539, c=0, m=2^31, nazwało ją RANDU i zapisali się tym samym w historii informatyki jako twórcy jednego z najchujowszych generatorów liczb pseudolosowych.

W czym tkwi problem? Otóż już w 1963 roku ktoś się kapnął, że owszem, w 1. i 2. wymiarze wszystko wygląda dość losowo, ale wystarczy przejść do 3. wymiaru, tzn. zrobić wykresik z punktami postaci (x_i, x_i+1, x_i+2), żeby zobaczyć, że wszystkie "losowe" punkty wyraźnie układają się na 15 dość odległych względem siebie płaszczyznach.

Jest to cecha wszystkich tego typu generatorów, jednak chodzi o to, żeby odległość międy tymi płaszczyznami minimalizować tak, żeby kostka złożona z następujących po sobie wygenerowanych liczb była wypełniona równomiernie. Dla jasności pokażę wam wykres dla RANDU i podobnego generatora ze standardowej biblioteki C GNU w pierwszym, drugim i trzecim wymiarze.

https://i.imgur.com/IR5zKD7.png

Wieść gminna niesie, że jeszcze w 1999 działały kompilatory FORTRANa używające RANDU.

W internecie można znaleźć bardziej ekstremalne przykłady spierdolenia tej implementacji. Ja chyba musiałem coś zjebać, bo mi się te płaszczyzny zazębiają (ale przynajmniej rzeczywiście jest ich 15), ale nadal widać, że coś jest grubo nie tak xD

Further reading:
https://young.physics.ucsc.edu/115/randu.pdf
https://web.archive.org/web/20181030204012if_/http://random.mat.sbg.ac.at/results/karl/server/node4.html#SECTION00041000000000000000
https://en.wikipedia.org/wiki/RANDU
https://en.wikipedia.org/wiki/Linear_congruential_generator

#
Pherun

@sens: sens po uruchomieniu projektora na własnym wykładdzie

#