Я думаю, что ваша догадка о том, чтобы передать экземпляр Random
как подозрительный, справедлива: когда изменяемое состояние полезно, полезно изолировать его, чтобы вы как можно больше выиграли от чистоты.
Здесь мы можем выделить состояние, создав последовательность, которая выдает различный набор случайных чисел на каждой итерации
open System
let rndSeq =
seq {
//note that by putting rnd inside seq expression here, we ensure that each iteration of the sequence
//yields a different sequnce of random numbers
let rnd = new Random()
while true do yield rnd.NextDouble()
}
затем вы можете использовать Seq.scan
для итерации случайной последовательности путем сопоставления элементов с использованием функции, которая сообщается предыдущим отображенным элементом.
let runSimulation inputSeq initialState =
inputSeq
|> Seq.scan
(fun (previousState:State) (inputElement:float) -> NextState previousState inputElement)
initialState
runSimulation rndSeq initialState //run the simulation using a random sequence of doubles greater than or equal to 0.0 and less than 1
Здесь вы можете видеть в качестве дополнительного бонуса, что ваша симуляция ввода и реализация симуляции больше не связаны, вы можете запустить симуляцию, используя любую последовательность ввода.