Python 排列组合

1.排列&组合

  • 有n个小球从中抽取m个,问有序抽取并且有重复的抽取个数为多少?

    n^m

  • 有n个小球从中抽取m个,问有序抽取并且无重复的抽取个数为多少?

    排列:A(n,m)

  • 有n个小球从中抽取m个,问无序抽取并且无重复的抽取个数为多少?

    组合:C(n,m)

  • 有n个小球从中抽取m个,问无序抽取并且有重复的抽取个数为多少?

    C(m+n-1, m)

以上四种情况均为最常见的排列组合,从有无顺序和是否重复两个维度进行思考,建议理解并背诵。

2.使用Python表示排列组合

在使用python计算排列组合之前,需要计算阶乘,可以有两种方式,一是使用math库中的factorial函数,二是使用如下的递归函数。

def factorial(n):
    """
    计算阶乘
    :param n: data
    :return:
    """
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

按照排列的公式:

def my_permutation(n, k):
    """
    计算无重复有序的排列数
    :param n: 样本
    :param k: 抽取
    :return: 排列数
    """
    return factorial(n)//factorial(n-k)

按照组合的公式:

def my_combination(n, k):
    """
    计算无序且不重复的组合数
    :param n: 样本
    :param k: 抽取
    :return: 组合数
    """
    return factorial(n)//(factorial(n-k)*factorial(k))

3.例题

3.1 生日问题

假设一个班级中共有n个人,一年有365天,其中每天作为生日的概率是相等的,那么其中至少有两个人的生日在同一天的概率是多少?

此题属于全排列问题,需要反向思考,写出公式之后直接输入到python中计算

def birth(n):
    """
    计算至少有两人的生日在同一天的概率
    :param n: 班级人数
    :return: 概率
    """
    return 1 - factorial(365)/(factorial(365-n)*365**n)


# prob = birth(50)
# print("{:.2f}%".format(prob*100))

3.2 大乐透问题

大乐透的玩法是这样的,从35个红球中选择5个,从12个红球中选择2个,如果全中,那就中一等奖。那么请问,中一等奖的概率是多少?

此题属于组合问题,中奖的可能性为一种,因此分子为1,分母为所有的组合情况。

def prize():
    return 1/(my_combination(35, 12) * my_combination(12, 2))


prob = prize()
print("{:.15f}%".format(prob%100))
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容