我遇到了问题。我必须在python中实现一个算法,它需要一个随机数X,如Pr [X≥k] = 1 / k。我不知道是否已经存在一个可以给我这个确切值的分布,或者是否有办法使用简单的随机python库实现这个随机生成器。有没有办法做到这一点?提前感谢您的帮助!
答案 0 :(得分:6)
最简单的尝试是
X = 1.0 / random.random()
但是,random.random()
的值可以为零,因此可能会导致被零除错误。根据文档,该值永远不能为1.0,因此请使用
X = 1.0 / (1.0 - random.random())
对于此分发,
Pr [X≥k] = Pr [0< 1 /X≤1/ k]
= Pr [0< 1 - random.random()≤1/ k]
= Pr [1 - 1 /k≤random.random()< 1]
= 1 - (1 - 1 / k){因为random()在[0,1)中是一致的,[1-1 / k,1]是一个子区间}
= 1 / k
(我希望我可以在这里使用MathJax!)当然,所有这些都假定k≥1,因为你的条件没有意义。我还假设X是一个连续的随机变量,从1到正无穷大。如果X是一个正整数(因此k也是一个正整数),那么只需采用我给出的公式的底线。
答案 1 :(得分:1)
Rory最终得到了正确答案,但他的数学证明它不具有建设性 - 它没有显示如何得到答案,它只表明他的断言是正确的。以下使用概率的基本规则来得出答案。
Pr{X ≥ k} = 1 - Pr{X < k}
如果X
是连续随机变量,
Pr{X < k} = Pr{X ≤ k}
右边是累积分布函数F X (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越界。
答案 2 :(得分:-2)
您需要的是一个统一的随机数生成器,用于生成随机数。 然后可以将这些数字转换为分布(例如乘法)
https://docs.python.org/2/library/random.html
https://docs.python.org/3.5/library/random.html
这些可以生成随机数。 我没有得到的是你的发行版。它如何以图形方式显示?如果你有一个代表它的函数,用它乘以随机数。