使用移动的钟形曲线创建 random.choices 权重

Using a shifted bell curve to create random.choices weights

我是 Python 的初学者,尝试的东西对我来说有点太复杂了。

我要输出一个列表(q),k-items长,其中每一项是五个选项之一(包含在列表 w).

w = [a, b, c, d, e]

我正在使用 random.choices 创建列表 q

我希望每个项目的权重由倾斜的钟形曲线(或什至是一个粗略的近似值)控制,其中曲线峰值的水平位置等于 pp 的范围可以从 0.1 到 1。

所以,如果p = 0.55,item c应该最有可能出现在list q,其中 bd 的概率第二高,ae 概率最低。如果p = 0.1,那么a应该是最有可能出现的,e应该是最不可能出现的,并且等等。

我发现 scipy.stats.skewnorm,这似乎可行。但是,我真的很难将它改编成我需要的形式。

我正在寻找一个函数,其中 0 ≤ y ≤ 1 且 0 ≤ x ≤ 1.2。然后我希望此函数为 random.choices 创建五个权重,如下所示:

p = 0.7

prob_a = f(0.2, p)

prob_b = f(0.4, p)

prob_c = f(0.6, p)

etc...

q = random.choices(w, weights=[prob_a, prob_b, prob_c, etc...], k=10)

如果有任何建议、方向或建议,我将不胜感激!我不拘泥于 random.choices 或 skewnorm – 如果有更简单的方法来获得类似的结果,那就太棒了!

根据您目前所写的内容,我认为您想要执行以下操作:

from scipy import stats
from random import choices

def weighted_choices(w, mu, sd, *, k=1):
    weights = stats.norm(mu, sd).pdf(range(len(w)))
    return choices(w, weights=weights, k=k)

其中 mu 是您最希望成为 w 的索引,而 sd 是您希望该选择的紧密程度。例如:

  • weighted_choices('abcde', 1, 0.1)几乎都会选择b
  • weighted_choices('abcde', 3, 0.5) 会倾向于选择 d 但有合理的机会选择 ce,而选择 a[= 的机会要小得多30=]
  • weighted_choices('abcde', 2, 10)基本统一