2014-11-04 44 views
3

我有一個列表:使用具有優先性和獨特性random.choice()

decisions = ['yes', 'no', 'unknown'] 

我使用這個列表寫入文件:

for x in range(0, 100): 
    file.write(random.choice(decisions)) 

會是什麼,以確保最有效的方法70%的價值寫成「未知」的東西?

我想隨機性的程度,而且還希望確保寫入到文件中的值的70是某一類型。我計劃從用戶那裏獲得這個百分比,這樣可以改變每一次運行。

如果我有另外的列表,這是更大的,並希望確保其唯一性(不重複的值,而且還隨機排序),這將是最好的方法是什麼?

+0

你想* *確切值的70%是'unknown',或概率只有70%?用72-15-13說一個文件可以嗎? 70-11-19?或者你總是想要70-15-15? – 2014-11-04 14:55:01

+0

值的正好70%是'unknown' – AmericanKryptonite 2014-11-04 15:01:48

+0

確定,見[我的回答如下](http://stackoverflow.com/a/26738797/13169)。 – 2014-11-04 15:23:58

回答

6

如果使用NumPy的是一個選擇,這是相當直接實現:

np.random.choice(['yes', 'no', 'unknown'], p=[0.15, 0.15, 0.7]) 

第二個數組p總和到一個且表示所述第一陣列中的對應的條目被選擇的概率。

上面將確保「未知」在每次選擇具有70%的概率。

Docs here


如果你想選擇100與正是 70 '未知' 的條目和30 '是' 或 '否' 的選擇:

hundred_choices = ['unknown']*70 + [random.choice(['yes', 'no']) for _ in range(30)] 

...然後洗牌hundred_choicesrandom.shuffle

+0

儘管如此,這並不能保證* 100只是'未知'。 – 2014-11-04 14:40:41

+0

謝謝@HannesOvrén - 我已經編輯了我的答案。 – 2014-11-04 14:52:28

0

如果你想爲'unknown'概率70%:

decisions = 70 * ['unknown'] + 15 * ['yes'] + 15 * ['no'] 
choice(decisions) 
4

爲了得到正是寫,你可以使用shuffle()功能,它包含的項目數預先生成的列表上的值的一定百分比你需要。

choices = ['unknown']*70 + ['yes']*15 + ['no']*15 
random.shuffle(choices) 
0

如果你想的'unknown'如果正好70%:

from random import choice, shuffle 

values = 70 * ['unknown']    # your 70 unknowns 
for i in range(30): 
    values.append(choice(['yes', 'no'])) # fill the rest randomly 
shuffle(values)       # shuffle 

for x in values: 
    file.write('{}\n', x)