【问题标题】:Generate random variable in real-time without state实时生成无状态随机变量
【发布时间】:2011-06-26 17:11:58
【问题描述】:

我想要一个函数,它将自上次调用以来经过的秒数作为输入,并返回 true 或 false 以判断事件是否应该在该时间段内发生。我希望它平均每经过 X 次(例如 5 秒)就会触发一次。如果可以不使用任何状态,我也很感兴趣,this question 的答案使用了。

我想要完全准确,它必须返回一个整数来表示应该发生的事件的数量,在它每 10*X 次或类似的情况下调用一次的情况下,所以加分!

【问题讨论】:

  • 这有什么不同: foo(time_elapsed) { return floor(time_elapsed/X); }?
  • @anonymous_21321:这是一个离散事件。它不会一次发生 0.2 次,而是一次发生。
  • @anonymous_21321:哦,更糟糕的是,如果我想要每秒 1 个事件,而你的 func 总是以 0.2 调用,它永远不会触发事件!
  • 我认为如果你想将过程建模为随机,你的函数应该返回一个概率,而不是一个布尔值。
  • @belisarius:嗯,有趣的一点。这对我行得通!提供一个答案,我会看看它。它不应该做一些愚蠢的事情,比如 return 1.0 if interval >= X 虽然

标签: language-agnostic math random time timing


【解决方案1】:

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

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

  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. ...等等。

请注意,是的,如果 t 与 1/lambda(即 X)相比较大,则在一个时间段内可能会发生多个事件。如果 t 与 1/lambda 相比总是很小,那么在此期间您不太可能获得多个事件,因此算法大大简化(如果 p

注意 2:不能保证每个间隔 X 至少获得一个事件。只是它会平均到那个值。

(以上是我的想法;仔细测试你的实现)

【讨论】:

  • 注意 2 很重要!否则它不会是完全随机的。所以我会迭代k,直到我得到一个数字> = p。我想需要进行一些优化,尽管它应该不太可能需要迭代太多,因为在一个小间隔内发生多个事件的机会很低
  • 为什么要迭代?在给定的间隔 t 内,您将获得 0、1、2、... 事件的可能性,而泊松分布可让您获得每个事件的正确比例。如果间隔 t 很小,那么是的,您可以进行 近似,即超过 1 个事件的概率很小,但是随着 t 向 X (= 1/lambda) 增加,这变成了一个很差的近似值。
  • 第 6 步:“...等等” = 重复第 2-5 步,不是吗?如果 Pr(k=0)>p,则返回 0;如果 Pr(k=0)+Pr(k=1)>p,则返回 1;如果 Pr(k=0)+Pr(k=1)+Pr(K=2)>p,则返回 2,等等……这就是迭代
  • @Claudiu 你说的很对,抱歉——我完全误读了你的评论。如您所说,如果 (lambda*t) 与 X 相比较小,则事件数 k 会很小。
【解决方案2】:

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

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

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

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

编辑

您应该使用高分辨率(一个事件的每个周期至少 20 个随机数)以使模拟有效。

【讨论】:

  • 考虑我不控制经过的时间 - 它只是用经过的时间调用。我不知道它是否有效。说我想要每秒 1 个事件。所以如果经过的时间是1,那么你会让我开火,保证。如果经过的时间是 0.5 两次,则您有 50% 的机会出现两次,这使事件有 75% 的机会在一秒钟内至少发生一次。如果经过的时间是 0.33 的 3 次,那么它有 89% 的机会发生。这不好,它不一致。
  • 确定不一致 - 您正在更改分辨率!事件每秒至少发生一次的概率收敛到 limit((1-1/x)^x)=1/e
  • 尽管如此,每个周期的平均事件数将为 1。尝试以周期/10000 的分辨率模拟它,持续 100,000 个周期。您总共应该有大约 100,000 个事件。
  • @Lior:嗯,是的,我看到它有效,虽然我不明白为什么......解释会很好;但问题仍然是我无法控制分辨率,那么如果分辨率比区间差怎么办?
  • 实际上你确实控制了分辨率。假设事件平均每秒发生一次,并且您想模拟 5 秒内的事件数量:运行 5*x 个轨迹,每条轨迹的概率为 (1/x),其中 x 是您的分辨率(20 或更高) .
猜你喜欢
  • 2011-06-26
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多