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