统一随机抽样
我的问题如下,我有4张扑克牌正面朝下。有一个国王,女王,杰克和王牌。我拿起一张卡片,看着它,然后把它放在我面前。我试图模拟1000次抽取3张牌(你可以多次选择同一张牌),即一个3的样本可以是杰克,杰克和国王。我试图做到这一点的位置:统一随机抽样
import random
cards=["King", "Queen", "Jack", "Ace"]
for i in range(1000):
print([random.sample(cards, 3)])
这一切确实是打印出1000次迭代捡3张卡的,但它从来没有挑选同一张卡的两倍,这是它应该。
我想要做的是统计我选择3张独特卡牌的次数,然后计算出这样做的概率。然后我想计算每次试用的不同卡片的平均数量。我知道这将有助于将值添加到列表中,但我不知道如何去做。道歉格式化,我没经验。
这应该得到所需要的输出
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)
这看起来就像你在找什么?
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)
运行时它每次输出1000。这告诉我,它可能没有考虑更换(你可以多次选择相同的卡)。因此,对于3个样本,我可以再次选择国王,杰克和国王。 – user333673
'random.sample'函数已经提到'返回从总体序列中选择的唯一元素的k长度列表[Random](https://docs.python。组织/ 2 /库/ random.html)。如果允许多个选择,你可以选择。 – djinn
蒙特卡洛可能会让人困惑 - 至少对我而言。我的第一步是尝试可以生成三张样本的代码。我设置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 '是微不足道的。 –