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