2017-10-19 93 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值,希望看到收敛。