2015-03-22 11 views
5

Ich habe 3 Etiketten: "A", "B", "C".Zufällige ungleichmäßige Verteilung mit gegebenem Anteil

Ich möchte eine zufällige Liste mit 100 Elementen erzeugen, 60% von ihnen sind "A", 30% sind "B", 10% sind "C".

Wie kann ich das tun? (Ich bin neu in Python, hoffen, dass diese Frage nicht zu dumm ist.)


Edit: Meine Frage ist etwas anders von dieser Frage: Generate random numbers with a given (numerical) distribution

Genau wie im Kommentar, ich will genau 60% von ihnen sind "A", nicht jedes Element hat eine Wahrscheinlichkeit von 60%, "A" zu sein. Also ist die numpy.random.choice() nicht die Lösung für mich.

+0

Das ist nicht wirklich zufällig, dann ist es? – marsh

+0

zufällig mit gegebener Verteilung: ABAAACBAAAB – aaaaaa

+0

Ah! Das macht mehr Sinn. – marsh

Antwort

3

Wenn Sie genau 60% wollen A sein, 30 % B und 10% C und Sie wissen, dass es 100 Elemente insgesamt sein hat, können Sie so etwas wie die folgenden tun:

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

thatll Ausgabe etwas wie BAAAAABBCBAABABAAAACAABBAABACAACBAACBBBAAACBAAAABAAABABAAAAABBBABAABAABAACCAABABAAAAAACABBBBCABAAAAA

+0

Danke! Ich lerne eine neue Methode! : D – xirururu

+0

Ich habe es aktualisiert, weil die alte Version nicht wirklich funktionierte (Multiplikation eines Floats mit einem String). – avacariu

2

So etwas wie, dass, wenn Verteilungen einheitlich sein sollten, ein Wille durchschnittlich in 60% der Fälle auftreten, und so andere Werte

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

Danke aandreev! : D – xirururu

+0

ok, jetzt sollte es funktionieren OK – aaaaaa

+0

Eine kleine Ecke Fall, aber wenn r entweder genau 0,6 oder .7 Ihre if..elif Leiter hätte nichts getan. Ich habe "<=" Zeichen hinzugefügt. – smci

4

Sie können nur eine Liste permutieren. Lassen Sie uns sagen Sie

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

dann die Liste erstellen, können Sie diese in-place wie so mischen:

from random import shuffle 
shuffle(x)