蒙特卡洛可能会让人困惑 - 至少对我而言。我的第一步是尝试可以生成三张样本的代码。我设置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值,希望看到收敛。
在循环中,您将希望获得样本的[unique count](https://stackoverflow.com/search?q=python+list+unique+count),检查它是否等于3,并添加到计数变量。 –
'random.sample'选择*无替换*。如果你有Python 3.6(或更新),请参阅'random.choice'。 [Documentation](https://docs.python.org/3/library/random.html#functions-for-sequences) – rici
@rici:如果你没有3.6,只实现统一版本的random.choice '是微不足道的。 –