具有给定最大值的离散概率分布
Discrete probability distribution with a given maximum
我必须生成具有给定最大值的 n
元素的随机离散概率分布。
我知道如何创建一个经典的,但我不知道如何生成尊重 max(distribution) = p
的 n
个元素的随机离散概率分布。我的意思是,分布的最高概率必须是 p in [0;1[
.
有什么想法吗?
您可以使用碰碰运气的方法(通常用于概率模拟以随机选择满足特定约束的元素)。性能是可以接受的除非 np 太接近 1。这是一个 Python 实现,应该很容易翻译成其他语言:
from random import random
def makeDist(n,p):
#assumes p*n > 1
miss = True
while miss:
x = [p]
rest = [random() for i in range(1,n)]
total = sum(rest)
rest = [x*(1-p)/total for x in rest]
if all(x < p for x in rest):
x.extend(rest)
miss = False #we have a hit!
return x
典型输出:
>>> dist = makeDist(6,0.2)
>>> dist
[0.2, 0.08986510724051082, 0.18690143846768711, 0.19758176720598397, 0.19299989610231708, 0.13265179098350102]
>>> max(dist)
0.2
>>> sum(dist)
1.0
>>> makeDist(3,0.35)
[0.35, 0.31154704906869274, 0.33845295093130723]
>>>
我必须生成具有给定最大值的 n
元素的随机离散概率分布。
我知道如何创建一个经典的,但我不知道如何生成尊重 max(distribution) = p
的 n
个元素的随机离散概率分布。我的意思是,分布的最高概率必须是 p in [0;1[
.
有什么想法吗?
您可以使用碰碰运气的方法(通常用于概率模拟以随机选择满足特定约束的元素)。性能是可以接受的除非 np 太接近 1。这是一个 Python 实现,应该很容易翻译成其他语言:
from random import random
def makeDist(n,p):
#assumes p*n > 1
miss = True
while miss:
x = [p]
rest = [random() for i in range(1,n)]
total = sum(rest)
rest = [x*(1-p)/total for x in rest]
if all(x < p for x in rest):
x.extend(rest)
miss = False #we have a hit!
return x
典型输出:
>>> dist = makeDist(6,0.2)
>>> dist
[0.2, 0.08986510724051082, 0.18690143846768711, 0.19758176720598397, 0.19299989610231708, 0.13265179098350102]
>>> max(dist)
0.2
>>> sum(dist)
1.0
>>> makeDist(3,0.35)
[0.35, 0.31154704906869274, 0.33845295093130723]
>>>