Последовательности выборки случайных чисел в Haskell
Мне нужны небольшие списки гауссовых случайных чисел для симуляции, поэтому я попробовал следующее:
import System.Random
seed = 10101
gen = mkStdGen seed
boxMuller mu sigma (r1,r2) = mu + sigma * sqrt (-2 * log r1) * cos (2 * pi * r2)
Это просто алгоритм Бокса-Мюллера - при заданных 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
Я бы х был первые 10 значенийmap (boxMuller 0 1) $ pairs $ randoms g
и y будет следующими 50 значениями в этом списке, и так далее.
Конечно, это невозможно, потому что функция всегда должна возвращать одинаковые значения при одинаковых входных данных. Как мне избежать этой ловушки?