Случайное неравномерное распределение с заданной пропорцией

У меня есть 3 ярлыка: "А", "В", "С".

Я хочу создать случайный список из 100 элементов, 60% из которых "A", 30% "B", 10% "C".

Как я могу это сделать? (Я новичок в Python, надеюсь, этот вопрос не слишком глуп.)


Изменить: Мой вопрос немного отличается от этого вопроса: генерировать случайные числа с заданным (числовым) распределением

Как и в комментарии, я хочу, чтобы 60% из них были "А", а не у каждого элемента вероятность 60% была бы "А". Так что numpy.random.choice() не является решением для меня.

3 ответа

Решение

Если вы хотите , чтобы именно 60% составляли A, 30% B и 10% C, и вы знаете, что всего должно быть 100 элементов, вы можете сделать что-то вроде следующего:

import random

num = 100
prob_a = 0.6
prob_b = 0.3
prob_c = 0.1

As = int(num*prob_a) * 'A'
Bs = int(num*prob_b) * 'B'
Cs = int(num*prob_c) * 'C'

# create a list with 60 As, 30 Bs, and 10 Cs
chars = list(As + Bs + Cs)
random.shuffle(chars)

print("".join(chars))

Это выведет что-то вроде BAAAAABBCBAABABAAAACAABBAABACAACBAACBBBAAACBAAAABAAABABAAAAABBBABAABAABAACCAABABAAAAAACABBBBCABAAAAA

Вы можете просто переставить список. Допустим, вы создали список

x = list('A'*60 + 'B'*30 + 'C'*10)

Затем вы можете перемешать это на месте следующим образом:

from random import shuffle
shuffle(x)

Примерно так, если распределение должно быть равномерным, A будет в среднем происходить в 60% случаев, и поэтому другие значения

import random
res = []
for i in range(0, n_samples):
   r = random.random()
   if(r<=0.6): res.append(A)
   elif(r>0.7): res.append(B)
   elif(r>0.6 and r<=0.7): res.append(C)
Другие вопросы по тегам