2015-03-22 13 views
5

Ho 3 etichette: "A", "B", "C".Distribuzione casuale non uniforme con proporzione data

Voglio generare un elenco casuale con 100 elementi, il 60% di essi sono "A", il 30% sono "B", il 10% sono "C".

Come posso fare questo? (Sono nuovo in python, spero che questa domanda non è troppo stupido.)


Edit: La mia domanda è un po 'diversa da questa domanda: Generate random numbers with a given (numerical) distribution

Proprio come nel commento, voglio esattamente Il 60% di loro sono "A", non ogni elemento ha una probabilità del 60% di essere "A". Quindi il numpy.random.choice() non è la soluzione per me.

+0

Quello non proprio casuale, allora è vero? – marsh

+0

casuale con distribuzione data: ABAAACBAAAB – aaaaaa

+0

Ah! Questo ha più senso. – marsh

risposta

3

Se vuoi esattamente il 60% di essere una, 30 % B e il 10% C e sai ci devono essere 100 elementi in totale, si può fare qualcosa di simile al seguente:

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)) 

che l'uscita'LL qualcosa come BAAAAABBCBAABABAAAACAABBAABACAACBAACBBBAAACBAAAABAAABABAAAAABBBABAABAABAACCAABABAAAAAACABBBBCABAAAAA

+0

Grazie! Imparo un nuovo metodo! : D – xirururu

+0

L'ho aggiornato perché la vecchia versione non funzionava (si stava moltiplicando un float con una stringa). – avacariu

2

Qualcosa del genere che, se le distribuzioni dovrebbero essere uniformi, una volontà in media si verificano nel 60% dei casi, e così gli altri valori

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

Grazie aandreev! : D – xirururu

+0

ok, ora dovrebbe funzionare OK – aaaaaa

+0

Un minuscolo caso d'angolo, ma se r era o esattamente 0.6 o .7 la tua ladder if..elif non avrebbe fatto nulla. Ho aggiunto i segni "<=". – smci

4

Puoi semplicemente permutare una lista. Diciamo si crea la lista

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

Quindi, è possibile rimescolare questo sul posto in questo modo:

from random import shuffle 
shuffle(x) 
Problemi correlati