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



У меня есть 3 метки: "A","B","C".



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



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





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



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

303   3  

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)

Comments

    Ничего не найдено.