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