Последовательности выборки случайных чисел в 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 значениями в этом списке, и так далее.

Конечно, это невозможно, потому что функция всегда должна возвращать одинаковые значения при одинаковых входных данных. Как мне избежать этой ловушки?

Ответы на вопрос(3)

Ваш ответ на вопрос