2015-03-22 18 views
5

Tôi có 3 nhãn: "A", "B", "C".Phân phối không đồng đều ngẫu nhiên với tỷ lệ đã cho

Tôi muốn tạo danh sách ngẫu nhiên với 100 phần tử, 60% trong số đó là "A", 30% là "B", 10% là "C".

Tôi làm cách nào để thực hiện việc này? (Tôi mới trong python, hy vọng câu hỏi này không phải là quá ngớ ngẩn.)


Edit: Câu hỏi của tôi là hơi khác với câu hỏi này: Generate random numbers with a given (numerical) distribution

Cũng giống như trong các bình luận, tôi muốn chính xác 60% trong số đó là "A", không phải mọi phần tử đều có xác suất 60% là "A". Vì vậy, numpy.random.choice() không phải là giải pháp cho tôi.

+0

Thats không thực sự ngẫu nhiên sau đó là nó? – marsh

+0

ngẫu nhiên với phân bổ đã cho: ABAAACBAAAB – aaaaaa

+0

Ah! Điều đó có ý nghĩa hơn. – marsh

Trả lời

3

Nếu bạn muốn chính xác 60% là A, 30 % B và 10% C và bạn biết có phải là 100 yếu tố trong tổng số, bạn có thể làm một cái gì đó như sau:

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

đó đầu ra sẽ giống như BAAAAABBCBAABABAAAACAABBAABACAACBAACBBBAAACBAAAABAAABABAAAAABBBABAABAABAACCAABABAAAAAACABBBBCABAAAAA

+0

Cảm ơn! Tôi học một phương pháp mới! : D – xirururu

+0

Tôi cập nhật nó vì phiên bản cũ không thực sự hoạt động (được nhân một phao bằng một chuỗi). – avacariu

2

Something như thế nếu phân phối nên được thống nhất, Di chúc trung bình xảy ra trong 60% các trường hợp, và các giá trị rất khác

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

Cảm ơn aandreev! : D – xirururu

+0

ok, bây giờ nó sẽ làm việc OK – aaaaaa

+0

Một trường hợp góc nhỏ, nhưng nếu r hoặc là chính xác 0,6 hoặc .7 nếu if..elif bậc thang của bạn sẽ không làm gì cả. Tôi đã thêm "<=" dấu hiệu. – smci

4

Bạn chỉ có thể hoán đổi danh sách. Cho phép nói bạn tạo danh sách

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

Sau đó, bạn có thể xáo trộn này tại chỗ như vậy:

from random import shuffle 
shuffle(x) 
Các vấn đề liên quan