2015-03-22 2 views
5

У меня есть 3 метки: «A», «B», «C».Случайное неравномерное распределение с заданной пропорцией

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

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


Edit: Мой вопрос немного отличается от этого вопроса: Generate random numbers with a given (numerical) distribution

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

+0

То на самом деле не случайным, то это? – marsh

+0

случайный с заданным распределением: ABAAACBAAAB – aaaaaa

+0

Ах! Это имеет больше смысла. – marsh

ответ

3

Если вы хотите точно 60%, чтобы быть A, 30 % в и 10% с, и вы знаете, что должно быть 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

+0

Спасибо! Я изучаю новый метод! : D – xirururu

+0

Я обновил его, потому что старая версия на самом деле не работала (умножала float на строку). – avacariu

2

Нечто подобное, что если распределение должно быть равномерным, Завещание в среднем встречаются в 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) 
+0

Спасибо aandreev! : D – xirururu

+0

ОК, теперь он должен работать нормально – aaaaaa

+0

Крошечный угловой футляр, но если r был ровно 0,6 или 0,7, ваша лестница if..elif ничего бы не сделала. Я добавил знаки «<=». – smci

4

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

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

Затем, вы можете перетасовать эту на месте так:

from random import shuffle 
shuffle(x) 
Смежные вопросы