这对我来说没什么意义
这意味着在相同的种子条件下重新运行模拟并不保证产生相同的结果
函数被评估的次数似乎并不重要(例如,除非是性能方面[例如昂贵的函数计算]或其他情况,如纠缠副作用等)。由于你正在从序列中抽取结果,并在某个标准下停止,生成这些结果的过程应该使用相同的输入可重复。如果这个迭代过程依赖于一个以特定种子值初始化的PRNG,并且状态转换函数依赖于一个不可变的环境和PRNG的当前状态(例如,函数纯但具有具有状有态PRNG的良性副作用),那么我不明白你如何创建不同的状态序列。如果块生成决定运行比必要的多22次,它不会影响前面的10次。这10个值(比如说第10个值在消耗seq时满足停止标准)将被缓存,并且与任何后续的值完全不相关,因此序列的不可变性得到保持。只要为每个生成的序列隔离一个PRNG,我相信你应该有完整的独立性和可重复性(当控制PRNG实现、运行时、Clojure版本等因素时)。
我已经进行了超过十年的离散事件模拟工作(主要是确定性的,虽然偶尔会有随机的初始条件)。可重复性非常重要,尤其是在比较验证和精细检查系统演变(例如中间状态)时。如果您控制种子、PRNG实例以及其他较早提到的因素,这将导致可重复的历史。
如前所述,如果您仍然担心,您可以通过使用迭代和transduce/reduce/into来定义一个不会分块(或生成中间序列)的急切迭代过程来保留熟悉度、性能和控制。我近年来通常出于性能原因而采取这条路线,尽管我的模拟在“帧”产生的数量上较小,而在状态转换函数的复杂性上较大。