2017-10-19 103 views
0

我的問題如下,我有4張撲克牌正面朝下。有一個國王,女王,傑克和王牌。我拿起一張卡片,看着它,然後把它放在我面前。我試圖模擬1000次抽取3張牌(你可以多次選擇同一張牌),即一個3的樣本可以是傑克,傑克和國王。我試圖做到這一點的位置:統一隨機抽樣

import random 

cards=["King", "Queen", "Jack", "Ace"] 

for i in range(1000): 
    print([random.sample(cards, 3)]) 

這一切確實是打印出1000次迭代撿3張卡的,但它從來沒有挑選同一張卡的兩倍,這是它應該。

我想要做的是統計我選擇3張獨特卡牌的次數,然後計算出這樣做的概率。然後我想計算每次試用的不同卡片的平均數量。我知道這將有助於將值添加到列表中,但我不知道如何去做。道歉格式化,我沒經驗。

+0

在循環中,您將希望獲得樣本的[unique count](https://stackoverflow.com/search?q=python+list+unique+count),檢查它是否等於3,並添加到計數變量。 –

+0

'random.sample'選擇*無替換*。如果你有Python 3.6(或更新),請參閱'random.choice'。 [Documentation](https://docs.python.org/3/library/random.html#functions-for-sequences) – rici

+0

@rici:如果你沒有3.6,只實現統一版本的random.choice '是微不足道的。 –

回答

1

這應該得到所需要的輸出

import random 
cards=["King", "Queen", "Jack", "Ace"] 
outputs = [] 
k = 0 
q = 0 
j = 0 
a = 0 
for i in range(1000): 
    x = random.sample(cards, 3) 
    outputs.append(x[0]) 
for y in range(len(outputs)): 
    if outputs[y] == 'King': 
     k +=1 
    elif outputs[y] == 'Queen': 
     q += 1 
    elif outputs[y] == 'Jack': 
     j +=1 
    elif outputs[y] == 'Ace': 
     a +=1 

print('No. kings =', k, 'No. Queens =', q, 'No. Jacks =', j, 'No. Aces =', a) 
0

這看起來就像你在找什麼?

from random import sample, choice 
from itertools import groupby 
cards=["King", "Queen", "Jack", "Ace"] 
unique = 0 
for i in range(1000): 
    #sample will return unique 
    d = sample(cards, 3) 
    if len(list(groupby(d))) == 3: 
     unique += 1 
print(unique) 
+0

運行時它每次輸出1000。這告訴我,它可能沒有考慮更換(你可以多次選擇相同的卡)。因此,對於3個樣本,我可以再次選擇國王,傑克和國王。 – user333673

+0

'random.sample'函數已經提到'返回從總體序列中選擇的唯一元素的k長度列表[Random](https://docs.python。組織/ 2 /庫/ random.html)。如果允許多個選擇,你可以選擇。 – djinn

0

蒙特卡洛可能會讓人困惑 - 至少對我而言。我的第一步是嘗試可以生成三張樣本的代碼。我設置N至10

for n in range(N): 
    sample = [random.choice(cards) for _ in range(3)] 
    print (sample) 

輸出是這樣的。顯然,這並不能保證我成功,但看起來代碼有可能產生所有可能性。如果我有任何擔憂,我可以嘗試增加N

['Jack', 'Jack', 'King'] 
['Jack', 'Ace', 'Ace'] 
['Ace', 'Ace', 'Jack'] 
['Ace', 'Queen', 'Ace'] 
['Ace', 'King', 'King'] 
['King', 'Jack', 'King'] 
['Queen', 'King', 'Ace'] 
['Queen', 'Queen', 'Queen'] 
['King', 'Jack', 'Ace'] 
['Jack', 'Jack', 'King'] 

你想統計唯一。這可以通過將samples轉換爲set並取其len來完成。計算平均值很容易。

unique_count = 0 
for n in range(N): 
    sample = [random.choice(cards) for _ in range(3)] 
    unique_count += 1 if len(set(sample))==1 else 0 

print(unique_count) 

字典是不是一個壞的地方保持計數。在循環外初始化它,然後增加條目。

import random 

cards=["King", "Queen", "Jack", "Ace"] 

N = 100000 

unique_count = 0 
card_counts = {_: 0 for _ in cards} 
for n in range(N): 
    sample = [random.choice(cards) for _ in range(3)] 
    unique_count += 1 if len(set(sample))==1 else 0 
    for s in sample: 
     card_counts[s]+=1 

print(unique_count) 
total = 0 
for s in cards: 
    total += card_counts[s] 
    print (s, card_counts[s]) 
print (total) 

當我在試驗時,我經常嘗試越來越大的N值,希望看到收斂。