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