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