我想在1-100之间随机选择一个数字,这样得到数字60-100的概率高于1-59。
我希望有可能成为数字1-100的左倾分布。也就是说,它有一个长尾和一个峰值。
有些事情:
pers = np.arange(1,101,1)
prob = <left-skewed distribution>
number = np.random.choice(pers, 1, p=prob)
我不知道如何生成左倾离散概率函数。有任何想法吗?谢谢!
答案 0 :(得分:3)
np.random.choice的p参数是与第一个参数中数组中每个元素相关联的概率。如下所示:
np.random.choice(pers, 1, p=[0.01, 0.01, 0.01, 0.01, ..... , 0.02, 0.02])
其中0.01是1-59的较低概率,0.02是60-100的较高概率。
SciPy文档有一些有用的例子。
http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.random.choice.html
编辑: 您也可以尝试使用此链接并查找适合您正在寻找的模型的分布(大约在页面的一半处)。
答案 1 :(得分:1)
与您所描述的一样,只需确保您的偏斜分布加起来为1.0:
pers = np.arange(1,101,1)
# Make each of the last 41 elements 5x more likely
prob = [1.0]*(len(pers)-41) + [5.0]*41
# Normalising to 1.0
prob /= np.sum(prob)
number = np.random.choice(pers, 1, p=prob)
答案 2 :(得分:0)
这是您使用SciPy函数'skewnorm'寻找的答案。它可以使任何正整数集向左或向右倾斜。
from scipy.stats import skewnorm
import matplotlib.pyplot as plt
numValues = 10000
maxValue = 100
skewness = -5 #Negative values are left skewed, positive values are right skewed.
random = skewnorm.rvs(a = skewness,loc=maxValue, size=numValues) #Skewnorm function
random = random - min(random) #Shift the set so the minimum value is equal to zero.
random = random / max(random) #Standadize all the vlues between 0 and 1.
random = random * maxValue #Multiply the standardized values by the maximum value.
#Plot histogram to check skewness
plt.hist(random,30,density=True, color = 'red', alpha=0.1)
plt.show()
请在此处参考文档: https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.skewnorm.html