在没有状态的情况下实时生成随机变量

时间:2011-02-14 05:09:01

标签: language-agnostic math random time timing

我想要一个函数,它接受自上次调用以来经过的秒数作为输入,并返回true或false,表示事件是否应该在该时间段内发生。我希望它平均每X次超过一次,比如5秒。我也感兴趣,如果没有任何状态可以做到,this question的回答是用的。

我想要完全准确,它必须返回一个应该发生的事件数量的整数,如果它每10 * X次调用一次或类似的事情,那么奖励积分!

2 个答案:

答案 0 :(得分:2)

听起来你正在描述一个Poisson process,给定时间间隔内的平均事件数由Poisson distribution给出,参数lambda = 1 / X.

对于给定的lambda值和t的参数值,在后一页上使用表达式的方法如下:

  1. 计算0到1之间的随机数;称之为 p
  2. 计算 Pr(k = 0)(即exp(-lambda*t) * (lambda*t)**0 / factorial(0)
  3. 如果此数字大于 p ,则模拟事件的数量为0. END
  4. 否则,计算 Pr(k = 1)并将其添加到 Pr(k = 0)
  5. 如果此数字大于 p ,则答案为1. END
  6. ......等等。
  7. 请注意,是的,如果t与1 / lambda(即X)相比较大,则在一段时间内最终会出现多个事件。如果t总是比1 / lambda小,那么你不太可能在这段时间内获得多个事件,因此算法大大简化了(如果p

    注2:无法保证每个X区间至少会有一个事件。只是它会平均到那个。

    (上面的内容相当于我的头脑;仔细测试你的实现)

答案 1 :(得分:0)

假设某个事件类型平均每10秒发生一次,并且您希望打印事件发生的模拟时间戳列表。

一种好的方法是每1秒产生一个[0,9]范围内的随机整数。如果它为0 - 触发该事件的第二个。当然你可以控制分辨率:你可以生成一个每0.1秒范围[0,99]的随机整数,如果它是0,则触发该DeciSecond的事件。

假设事件之间没有依赖关系,则无需保持状态。

根据所需的分辨率,找出事件在给定时间片内发生的次数 - 只生成足够的随机整数。

修改

您应该使用高分辨率(每个事件的每个周期至少20个randoms)才能使模拟有效。