【问题标题】:Uniformly random sampling均匀随机抽样
【发布时间】:2018-03-31 02:00:01
【问题描述】:

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

import random

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

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

所有这一切都是打印出 1000 次选择 3 张牌的迭代,但它不会两次选择同一张牌,这是应该的。

我想做的是计算我选择 3 张独特卡的次数,然后计算这样做的概率。然后我想计算我每次尝试选择的不同卡的平均数量。我知道将值添加到列表中会有所帮助,但我不确定如何去做。为格式化道歉,我没有经验。

【问题讨论】:

  • 在循环中你会想要得到样本的unique count,检查它是否等于3,然后添加到一个计数变量中。
  • random.sample 选择不替换。如果您有 Python 3.6(或更新版本),请参阅 random.choiceDocumentation
  • @rici:如果你没有 3.6,那么只实现 random.choice 的统一版本是微不足道的。
  • @davis:当然,没有争议。但是阅读文档总是一个好习惯。您可能会发现有用的东西。
  • @rici:当然:比起其他库更喜欢标准库而不是自己做。我只是不想阻止没有那个版本的人。

标签: python random


【解决方案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)

【讨论】:

    【解决方案2】:

    这看起来像你在看的吗?

    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 个样本,我可以再次选择 King、Jack 和 King。
    • random.sample 函数已经提到了 Return a k length list of unique elements chosen from the population sequence Random。如果允许多个选择,您可以选择。
    【解决方案3】:

    蒙特卡洛可能会令人困惑——至少对我而言。我的第一步是尝试生成三张卡片样本的代码。我将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 值,以期看到收敛。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2014-06-06
      • 1970-01-01
      • 2020-09-07
      相关资源
      最近更新 更多