使用移动的钟形曲线创建 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。
我希望每个项目的权重由倾斜的钟形曲线(或什至是一个粗略的近似值)控制,其中曲线峰值的水平位置等于 p。 p 的范围可以从 0.1 到 1。
所以,如果p = 0.55,item c应该最有可能出现在list q,其中 b 和 d 的概率第二高,a 和 e 概率最低。如果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
但有合理的机会选择 c
或 e
,而选择 a
[= 的机会要小得多30=]
weighted_choices('abcde', 2, 10)
基本统一
我是 Python 的初学者,尝试的东西对我来说有点太复杂了。
我要输出一个列表(q),k-items长,其中每一项是五个选项之一(包含在列表 w).
w = [a, b, c, d, e]
我正在使用 random.choices 创建列表 q。
我希望每个项目的权重由倾斜的钟形曲线(或什至是一个粗略的近似值)控制,其中曲线峰值的水平位置等于 p。 p 的范围可以从 0.1 到 1。
所以,如果p = 0.55,item c应该最有可能出现在list q,其中 b 和 d 的概率第二高,a 和 e 概率最低。如果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
但有合理的机会选择c
或e
,而选择a
[= 的机会要小得多30=]weighted_choices('abcde', 2, 10)
基本统一