Документация из numpy.random.choice
говорит вам, что аргумент p
- это вероятности, связанные с каждой записью. И если не дано, предполагается равномерная вероятность.
Равномерная вероятность означает, что вероятность выбора любого из предметов равна. Но это не значит, что количество результатов будет пропорционально вероятности всегда .
Пример: при подбрасывании монеты вероятность получить голову равна вероятности получить хвост. Но всегда ли я получу 5 голов и 5 хвостов, когда брошу 10 раз? Нет.
toss=[np.random.choice(["head","tail"]) for _ in range(10)]
print(Counter(toss)) #Counter({'head': 7, 'tail': 3})
Точно так же в вашем случае вы только упомянули, что вероятность получения P1
равна 0,8, но это не значит, что вы всегда будете видеть 8 P1
с при случайном выборе 10 раз, это только означает, что вероятность получения это значительно выше, чем у остальных.
РЕДАКТИРОВАТЬ :
Чтобы получить необходимую вам функциональность, вы можете написать функцию, которая копирует элемент списка. Учитывая вероятность (p = 0,8) и общее количество элементов (n = 10), количество повторений должно составлять p*n
def MyDist(elements,weights,num):
a=[]
for i in range(len(elements)):
a+=[elements[i]]*int(weights[i]*num)
return a
MyDist(['P1','P2','P3'],[0.8,0.1,0.1],10)
#['P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P2', 'P3']