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