【问题标题】:Random Number following a certain distribution遵循一定分布的随机数
【发布时间】:2016-07-30 16:01:15
【问题描述】:

我遇到了一个问题。我必须在 python 中实现一个算法,它需要一个随机数 X,例如 Pr[X ≥ k] = 1/k。我不知道是否已经存在一个可以给我这个确切值的分布,或者是否有一种方法可以使用简单的随机 python 库来实现这个随机生成器。有没有办法做到这一点?提前感谢您的帮助!

【问题讨论】:

  • 不确定您要做什么
  • 嗨!我正在尝试生成一个随机数 X ,它遵循我描述的分布。问题要求的是根据分布 Pr X ≥ k = 1/k 选择 X
  • 这就是你要找的东西:stackoverflow.com/a/4266312/2348704
  • 如果这是一种常见的分发类型,请尝试搜索它的名称和 python——您可能会找到一个第三方库来执行此操作(或者即使它是内置的)。
  • $k$ 是否作为输入给出?

标签: python random probability


【解决方案1】:

最简单的尝试是做

X = 1.0 / random.random()

但是,random.random() 的值可以为零,因此这可能会导致被零除的错误。根据文档,该值永远不能为 1.0,因此请使用

X = 1.0 / (1.0 - random.random())

对于这个分布,

Pr[X ≥ k] = Pr[0

= Pr[0

= Pr[1 - 1/k ≤ random.random()

= 1 - (1 - 1/k) {因为 random() 在 [0,1) 中是均匀的并且 [1-1/k, 1) 是子区间}

= 1/k

(我希望我可以在这里使用 MathJax!)当然,所有这些都假设 k ≥ 1,因为否则您的条件没有任何意义。我还假设 X 是一个连续的随机变量,从 1 到正无穷大。如果 X 是一个正整数(因此 k 也是一个正整数),只需取我给出的公式的下限。

【讨论】:

  • 是的,这就是我需要的!非常感谢!
【解决方案2】:

Rory 最终得到了正确的答案,但他的数学证明并不具有建设性——它没有显示如何得到答案,它只表明他的断言是正确的。下面使用概率的基本规则来得出答案。

Pr{X ≥ k} = 1 - Pr{X < k}

如果X是一个连续随机变量,

Pr{X < k} = Pr{X ≤ k}

右手边是累积分布函数FX(k)的定义,所以

Pr{X ≥ k} = 1 - F(k) = 1/k
F(k) = 1 - 1/k

然后by the inversion theorem我们可以设置等于U,一个统一的(0,1)RV,并求解k:

U = 1 - 1/k
1 - U = 1/k
k = 1 / (1 - U)

使用 U 的随机数生成器,您就完成了。正如 Rory 指出的那样,这仅对 k ≥ 1 有效,否则会导致 CDF 越界。

【讨论】:

  • 我看不出我的数学是怎么错的。我承认它很简短,只显示了一个步骤,但那是因为我认为其余的对于那些知道概率的人来说是显而易见的。你激励我为我的平等增加更多步骤,但没有任何改变。你同意我现在的阐述是正确的吗? (当然,我仍然遗漏了一些细节——我不想学究气。)
  • @RoryDaulton 您的第二行是以您对 X 应该是什么的断言为前提的,它不遵循任何基本的概率规则。数学从那里开始计算,因为您的断言恰好是真的,但这并不能使断言先验有效。相比之下,我的推导遵循众所周知的概率规则,最终得到您断言的结果。
  • 显然,您的意思是您从期望的目标派生了表达式,而我表明我的表达式满足了目标。我们朝相反的方向工作,但这并不会使我的数学“无效”。有关这两种方法之间差异的详细讨论,请参阅 George Polya 的 How to Solve It
  • 没有矛盾的证明可以确定您的结果的正确性,但除了直觉的飞跃之外,没有向任何人展示如何到达那里。从第一原理推导出结果进行概括。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
相关资源
最近更新 更多