以上四种情况均为最常见的排列组合,从有无顺序和是否重复两个维度进行思考,建议理解并背诵。
创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站设计、成都网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的兴化网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
在使用python计算排列组合之前,需要计算阶乘,可以有两种方式,一是使用math库中的factorial函数,二是使用如下的递归函数。
按照排列的公式:
按照组合的公式:
3.1 生日问题
假设一个班级中共有n个人,一年有365天,其中每天作为生日的概率是相等的,那么其中至少有两个人的生日在同一天的概率是多少?
此题属于全排列问题,需要反向思考,写出公式之后直接输入到python中计算
3.2 大乐透问题
大乐透的玩法是这样的,从35个红球中选择5个,从12个红球中选择2个,如果全中,那就中一等奖。那么请问,中一等奖的概率是多少?
此题属于组合问题,中奖的可能性为一种,因此分子为1,分母为所有的组合情况。
在日常的工作学习中,我们肯定会遇到排列组合问题,比如,在5种颜色的球中,任意取3个,共有多少种组合方式,这也包括有放回和无放回抽样。
在python中,自带的排列组合函数,都在python的指导工具包itertools中。
product 笛卡尔积(有放回抽样排列)
permutations 排列(不放回抽样排列)
combinations 组合,没有重复(不放回抽样组合)
combinations_with_replacement 组合,有重复(有放回抽样组合)
python3中返回的为对象,可以通过迭代读取将值输出。
end
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#python2.7
import string,random
def get_clice(num):
res =[]
tmp = list(string.lowercase)
for i in range(num):
res.append(''.join(random.sample(tmp,random.randint(3,7))))
return res
print get_clice(20)
除了这3个数都选0个外共有239种组合,代码(缩进见图):
c=0
for i in range(5):
for j in range(6):
for k in range(8):
r='1.25+'*i+'2.5+'*j+'3+'*k
if r:
c+=1
print(r[:-1],'=',sum((1.25*i,2.5*j,3*k)),sep='')
print(f'共{c}种组合')
import math
m = int(input("请输入第一个数字:"))
n = int(input("请输入第二个数字:"))
if m 0 or n 0 or m - n 0:
print("负数是没有阶乘,请重新输入!")
else:
result = math.factorial(m) / math.factorial(n) / math.factorial(m - n)
print("按照公式C(m, n) = m!/n! /(m - n)!,C({0},{1})的答案为 {2}".format(m, n, result))