如何计算两组列表之间数字匹配的概率? (python)

How to calculate a probability of numbers matching up between two sets of lists? (python)

我正在尝试制作一个彩票程序,其中包含我从 1 到 10 选择的 6 种元素的优惠券。 (为了这个例子,我把数字改得简单了)。以下脚本负责生成 1 到 10 范围内的随机 6 个数字元素,并找到它们之间以及我的优惠券之间的交集,但我想计算(比率)的机会,例如,4 对决生成的随机数之间和我的优惠券之间的数字。有什么想法吗?

import random
from collections import Counter
mc = [9, 6, 5, 4, 8, 1]
mycoupon = set(mc)
for _ in range(100):
    r = random.sample(range(1, 10), 6)
    draws = set(r)
    
    cc = Counter(mycoupon)
    dc = Counter(r)
    common = cc.keys() & dc.keys()
    counts = 0
    for cel in common:
        counts += min(cc[cel], dc[cel])

    print("My coupon: ", mycoupon)
    print("Draw: ", draws)
    print("Matches: ", counts)

与其说是编程题,不如说是概率题。不过不用担心,概率很酷。

因此,在您的示例中,票证上有 6 个元素。假设每个元素的可能值的数量是 N(在您的示例中 N=10)。

我假设对于每个元素,所有 N 个值的可能性均等。我还假设每个元素的值都是独立于其他元素选择的。这意味着 N^6 种可能的门票中的每一张都有相同的可能性。

这意味着我们可以根据满足该条件的票数计算某些条件发生的可能性。例如,一张彩票匹配所有 6 个号码的机会是 1 / N^6,因为只有一张彩票匹配所有 6 个号码。

如果要计算恰好匹配4个数字的概率,我们只需要计算恰好匹配4个元素的票数即可。我们可以通过考虑生成票证的过程来计算它们:

  • 首先,select匹配哪4个元素,设置它们等于真实值。
  • 然后 select 剩余元素的值,将它们设置为匹配值以外的任何值。

此过程可以生成恰好匹配 4 个元素的任何票证。它无法生成具有超过 4 个元素匹配的工单。所以如果我们计算这个过程可能会选择多少张票,那就是恰好匹配 4 个元素的票数。

第一步有 6 choose 4 = 15 个可能的选择。第二步有 (N-1)^2 种可能的结果(N-1 因为我们无法选择正确的值)。

因此,与 6 张票中的 4 张票完全匹配的票数为 15 * (N - 1)^2,概率为 15 * (N-1)^2 / N^6。在您的 N=10 示例中,即 15 * 9^2 / 10^6 = 0.001215.

对于长度为T的门票的一般情况,您希望恰好匹配k个元素,每个元素最多为N,概率应该是(T选择k)*(N-1)^( T-k) / N^T.

可能在 Python 中最方便的写法是实际计算,计算匹配票的数量,然后除以 N^T。这是因为Python(至少,Python 3,不知道Python 2)会自动切换到使用bignums来处理大整数,所以你不用担心关于精度损失或溢出。