美文网首页
Python 排列组合

Python 排列组合

作者: 一个扫地的垃圾 | 来源:发表于2020-08-19 16:08 被阅读0次

    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))
    

    相关文章

      网友评论

          本文标题:Python 排列组合

          本文链接:https://www.haomeiwen.com/subject/fqqdjktx.html