Python 均匀随机抽样

Python 均匀随机抽样,python,random,Python,Random,我的问题如下,我面前有4张扑克牌面朝下。有国王、王后、杰克和王牌。我拿起一张卡片,看着它,然后把它正面朝下放在我面前。我试着模拟拾取3张牌1000次,你可以多次拾取同一张牌,即3张牌中的一张可以是Jack、Jack和King。我在这里尝试过这样做: import random cards=["King", "Queen", "Jack", "Ace"] for i in range(1000): print([random.sample(cards, 3)]) 所有这一切只是打印出

我的问题如下,我面前有4张扑克牌面朝下。有国王、王后、杰克和王牌。我拿起一张卡片,看着它,然后把它正面朝下放在我面前。我试着模拟拾取3张牌1000次,你可以多次拾取同一张牌,即3张牌中的一张可以是Jack、Jack和King。我在这里尝试过这样做:

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)

蒙特卡洛可能会让人困惑——至少对我来说是这样。我的第一步是尝试生成三张卡片样本的代码。我把N设为10

结果是这样的。显然,这并不能保证我是成功的,但似乎代码可以产生所有的可能性。如果我真的有什么担心的话,我可以试着增加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']
你要数一数。这可以通过将样本转换为一个集合并获取其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值,希望看到收敛。

在循环中,您将希望获得样本的最大值,检查它是否等于3,并将其添加到计数变量。random.sample选择而不替换。如果您使用的是Python 3.6或更高版本,请参阅random.choice@rici:如果你没有3.6版本,那么只实现random.choice的统一版本是微不足道的。@davis:当然,没有参数。但是阅读文档总是一个好习惯。你可能会发现有用的东西。@rici:当然,比起自己动手,你更喜欢标准库。我只是不想阻止任何人没有那个版本。当运行它时,每次输出1000。这告诉我,它可能不考虑更换,您可以多次选择同一张卡。因此,对于3个样本中的一个,我可以再次选择King、Jack和King.random.sample函数已返回从总体序列中选择的k长度唯一元素列表。如果允许多选,你可以选择。
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)