我想生成一个n
概率列表,其概率总和为1.该列表具有固定大小,但可能是任意大的。因此n
可能是111
,2
,10
,14
,100
等。我意识到这可能是一个计算挑战排序并且可能没有一种最好的方法可以做到这一点,但我仍然乐意欣赏合理方法的建议。
答案 0 :(得分:4)
我认为最好的方法是生成所需大小的随机数列表,添加所有数字并将每个数字除以总数:
randlist = [randon.random() for i in range(n)]
total = sum(randlist)
randlist = [i/total for i in randlist]
答案 1 :(得分:1)
与Smetterleen类似,但效率可能略高:
import random
def generate(n):
unnormalised = [random.random() for _ in range(n)]
s = sum(unnormalised)
normalised = map(lambda x: x/s, unnormalised)
return normalised
值得注意的是,这些都不一定总和精确到1 :
>>> sum(generate(4))
1.0
>>> sum(generate(4))
1.0
>>> sum(generate(4))
1.0000000000000002
>>> sum(generate(4))
0.9999999999999999
>>> sum(generate(4))
1.0