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