请帮助理解random.choices()权重

2024-04-20 00:30:28 发布

您现在位置:Python中文网/ 问答频道 /正文

希望能得到一些关于使用random.choices()理解权重的帮助

import random
k = 100

population = random.choices(
population=[['a'],['b'],['c'],['d'],['e'],['f'],['g'],['h'], ['i'],['j']],
weights=[10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
k=k)

print(population.count(['a'])/k,
population.count(['b'])/k,
population.count(['c'])/k,
population.count(['d'])/k,
population.count(['e'])/k,
population.count(['f'])/k,
population.count(['g'])/k,
population.count(['h'])/k,
population.count(['i'])/k,
population.count(['j'])/k)

因此,我已经阅读了关于这一点的几个答案,我的理解是,在计算每个字符串的权重时,这应该是一个公式:

总重量是100

a为10/100或10%

b为10/100或10% 等等

我说的对吗

其次,在测试上面的代码时,我没有得到与我预期的实际权重相匹配的细分,即几乎每个字母都会出现

有人能尽可能简单地向Python新手解释一下原因吗


Tags: 字符串答案代码importcount字母random公式
1条回答
网友
1楼 · 发布于 2024-04-20 00:30:28

你对权重有正确的理解。我不确定您的问题到底是什么,也许您的代码在其他地方有错误。另一个可能的错误是random.choices使用替换从人群中进行采样。阅读文档here。这意味着您可以使用k=15进行采样,然后像3as和0bs那样拉出

这是我用来测试的代码,希望对您有用

import random
from collections import defaultdict
from pprint import pprint
random.seed(500)

d = defaultdict(int)
sum = 0
# Run this a bunch of times
for _ in range(100000):
    r = random.choices(
        population=[['a'],['b'],['c'],['d'],['e'],['f'],['g'],['h'], ['i'],['j']],
        weights=[10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
        k=9)
    for ch in r:
        d[ch[0]] += 1
        sum += 1

for k, v in d.items():
    proportion = v/sum
    print(f'{k}: {proportion}')

输出

h: 0.10035777777777778
j: 0.10031111111111111
f: 0.10043333333333333
c: 0.09983555555555555
d: 0.09992888888888889
i: 0.0998
a: 0.10010222222222222
e: 0.09956555555555556
b: 0.10003222222222222
g: 0.09963333333333334

运行random.choices并替换k = 15的示例:

[['h'], ['j'], ['f'], ['c'], ['h'], ['d'], ['i'], ['d'], ['f'], ['h'], ['a'], ['d'], ['d'], ['c'], ['j']]

这完全是意料之中的事!如果你不明白这一点,再复习一下你的统计数据

编辑:根据你原来帖子上的评论,你应该重新审视一下抽样替换的分布情况。如果在100个样本中,各种字母的所有概率都收敛到10%,这将是非常令人惊讶的。我建议你买一个六面骰子,开始滚动,同时记录它落在什么数字上。根据你的样本,要想得到每一个有1/6几率的数字,需要掷几次骰子

相关问题 更多 >