Это не совсем та же сигнатура, что и Simulate
, но вы можете сделать это довольно элегантно с помощью метода iterate
, который вы найдете в List
, Stream
и т. Д.:
val entry = PersonEntry(1, 2018, 20, 1)
val entries = List.iterate(entry, 100)(_.Simulate(0.95))
Это говорит: «начните с entry
, вызовите .Simulate(0.95)
для него, затем вызовите .Simulate(0.95)
для полученного результата, а затем для этого результата, 100 раз подряд, собирая результаты вlist ", который выглядит, например, так:
scala> entries.foreach(println)
PersonEntry(1,2018,20,1)
PersonEntry(1,2019,21,1)
PersonEntry(1,2020,22,1)
PersonEntry(1,2021,23,1)
PersonEntry(1,2022,24,1)
PersonEntry(1,2023,25,1)
PersonEntry(1,2024,26,1)
PersonEntry(1,2025,27,1)
PersonEntry(1,2026,28,1)
PersonEntry(1,2027,29,1)
PersonEntry(1,2028,30,1)
PersonEntry(1,2029,31,1)
PersonEntry(1,2030,32,1)
PersonEntry(1,2031,33,0)
PersonEntry(1,2032,34,0)
...
С Stream
вам даже не нужно заранее задавать количество итераций:
val entries = Stream.iterate(entry)(_.Simulate(0.95))
Теперь у вас естьбесконечный поток лет в вашей симуляции, на который вы можете взглянуть:
scala> entries.take(10).foreach(println)
PersonEntry(1,2018,20,1)
PersonEntry(1,2019,21,1)
PersonEntry(1,2020,22,1)
PersonEntry(1,2021,23,1)
PersonEntry(1,2022,24,1)
PersonEntry(1,2023,25,1)
PersonEntry(1,2024,26,0)
PersonEntry(1,2025,27,0)
PersonEntry(1,2026,28,0)
PersonEntry(1,2027,29,0)
Обратите внимание, что ни одно из этих решений не является чисто функциональным, поскольку вы полагаетесьна генераторе случайных чисел, и вы будете получать разные результаты при каждом запуске программы, но это функционально в том смысле, что в нем не используется изменяемая коллекция для сбора результатов.