Мне нужны небольшие списки гауссовых случайных чисел для моделирования, поэтому я попробовал следующее:
import System.Random
seed = 10101
gen = mkStdGen seed
boxMuller mu sigma (r1,r2) = mu + sigma * sqrt (-2 * log r1) * cos (2 * pi * r2)
Это просто алгоритм Box-Muller - при заданных r1, r2 равномерных случайных числах в интервале [0,1] он возвращает гауссовское случайное число.
normals 0 g = []
normals n g = take n $ map (boxMuller 0 1) $ pairs $ randoms g
where pairs (x:y:zs) = (x,y):(pairs zs)
Поэтому я использовал эту функцию normals
каждый раз, когда мне нужен список случайных чисел.
Проблема с этим должна быть очевидной: она генерирует всегда одну и ту же последовательность, потому что я использую всегда одно и то же семя! Я не получаю новые последовательности, я все время получаю первые n значений последовательности.
То, что я притворялся, было то, что когда я печатаю:
x = normal 10
y = normal 50
У меня будет x для первых 10 значений map (boxMuller 0 1) $ pairs $ randoms g
, а y - следующие 50 значений в этом списке и т.д.
Конечно, это невозможно, потому что функция всегда должна возвращать те же значения при одном и том же вводе. Как избежать этой ловушки?