从列表中选择一个有概率的字符串



我试图创建一个函数,返回具有给定概率的随机单词字符(字母)。我的参考资料是这个维基百科页面。在表格中,你可以看到字母t有16%的机会是第一个字母。然而,字母x有0.045%的机会。我想把每一个字母都包括进去。

我相信有比这更好的方法:

import random
def selectLetter():
letters = ['t', 't', (x16000 times), 'o', (x7600 times),... , 'x', (x45 times)]
random.choice(letters)

加分:如果代码能够接受一组/列表(或其他)字母并排除它们并相应地调整概率。这不是必须的,但这将是伟大的!

如何创建这样的函数?

这个函数返回一个随机字母,根据维基百科页面上的前几个条目进行加权。你需要完成字母字典(这样概率加起来等于1),使其完全发挥作用。

import random
def random_weighted_letter():
letters = {"a": 0.017,"b": 0.044,"c": 0.052,"d": 0.032,"e": 0.028,"f": 0.04}
return random.choices(population=list(letters.keys()), weights=letters.values())[0]

查看加权列表:

from numpy.random import choice
elements = [1, 2, 3] 
weights = [0.2, 0.1, 0.7]
one = 0
two = 0
three = 0
for i in range(1000):
num = choice(elements, p=weights)
if num==1:
one+=1
elif num==2:
two+=1
else:
three+=1
print(one,two,three, one/1000, two/1000, three/1000)

输出:

217 108 675 0.217 0.108 0.675

如果有更多的循环,你最终可能会得到由权重设定的确切概率。当然,用你的字母和权重替换列表,概率在0-1之间,sum必须为1 (100%)

你也可以为选项提供大小,创建一个具有给定概率的期望大小的随机值列表:

res = choice(elements, p=weights, size=1000)
print(list(res).count(1)) #199 first time, next time 178

最新更新