我正在创建一个需要生成确定性随机事件的应用。它们需要具有确定性,以便我可以计算应用程序关闭时发生的事件。 我想找到一个函数f(time1,time2),它告诉我在任何两个时间点之间发生了多少事件,而没有生成完整的过程。它也应该是f(t1,t3)= f(t1,t2)+ f(t2,t3)。
我从this question开始,但是开始这个新的,所以我可以重写它,因为我对我正在寻找的东西有更好的了解。
答案 0 :(得分:0)
让我们重写一下这个问题。假设您的f
已存在。然后你可以使用二进制搜索找到下一个事件的时间到你想要的任何精度。所以首先构建f
。
那么我们如何创建f
?好吧,我们只需要从f
计算0
到任意t
然后f(s, t) = f(0, t) - f(0, s)
。
我们甚至不需要能够为每个t
直接计算它。如果我们可以在每个整数计算它,如果我们在一个区间的两端都有它,如果我们可以在中点计算它,那就足够了。由于f
不是递减且始终是整数,因此二分算法最终将t
夹在我们知道f
的两个具有相同值的点之间。
现在我们有办法了。我们将以整数计算它。然后,一旦我们将t
夹在中间,就开始一分为二,直到我们有f(0,t)
的下限和上限相同。
我们可以通过生成随机数从整数到整数,然后使用泊松分布来查找发生了多少事件。如果我们在一个区间的两端知道f
,我们可以使用相同的技巧在中点找到它,但这次知道在区间的前半部分发生的事件数由二项式描述分布。
担心我们需要一个具有2个不相关的“移动下一个”选项的伪随机生成器的技巧。其中一个当我们在间隔的上半部分移动下一个间隔/土地时。另一种是当我们停止在间隔的下半部分移动间隔/土地时。而且我们需要在两者之间走的路径不能给出相同的答案。否则,您的随机事件将以奇怪的周期性方式分发。我建议通过使用两个不同的生成器来实现这一点,这些生成器使用相同范(如果它们接近但不相同,你可以重复你正在做的那个,直到种子在公共范围内结束......)你使用哪个发生器取决于最后一次翻转带你的方向。
找出正确使用的可能需要一些思考。但希望这比你开始时的问题更容易理解!
答案 1 :(得分:0)
如果我理解你的约束,你(A)不想存储你的过程,因为它很大。 (B)由于同样的原因,不想重复生成过程。但你可以尝试一种混合策略。
获取任何随机数生成器R,你可以(A)确定性种子和(B)读取状态(见下文如何伪造)。
现在:
R.state
(或使用硬编码设置)N
个样本并使用它们来生成泊松过程。R.state
)稍后当您返回数据时,您可以找到之前的最后一次
感兴趣的间隔,查找R.state
和CDF并开始重新生成
你的泊松过程。您永远不必生成超过N
个额外样本,但您只需存储每个Nth
州。
现在如何存储随机数生成器的状态?其中一些具有用于读出其状态的API函数。另一个技巧是使用两个生成器R1
,R2
。然后使用R2
为每个N点种子R1
。 R1
的值就是您存储的“状态”。