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