摘要
看到一个小游戏, 分别有三种颜色的小球各 9个, 总共27个,从中任意拿出9个, 可能出现的情况,再不考虑颜色的情况下分别出现的组合的概率计算,使用python完成
计算C(m, n) 和A(m, n)
首先 python中有个math 模块,这个模块可以分别计算出 排列和组合
#排列
def getPerm(m, n):
return math.perm(m, n)
#组合
def getComb(m, n):
return math.comb(m, n)
数学公式
此问题中从27个小球中取出9个小球,可以分为三类 来讨论
第一种, 三个数字相同,即3, 3,3
第二种, 三个数字都不相同, 例如 0, 1 , 8
第三种, 三个数字中任意两个相同, 例如, 4, 4 ,1
第一种情况下的时候, 概率为P = C(9,N)xC(9,N)xC(9,N)x A(3, 0) / C(27, 9)
第二种情况下的时候, 概率为P = C(9,N1)xC(9,N2)xC(9,N3)x A(3, 3) / C(27, 9)
第三种情况下的时候, 概率为P = C(9,N1)xC(9,N1)xC(9,N2)x A(3, 1) / C(27, 9)
数学公式的代码实现
- 计算分母
def CalculateProbability_denominator(all_nums, out_nums):
return math.comb(all_nums, out_nums)
- 计算分子
def CalculateProbability_molecule(num1, num2, num3, fixed_num):
temp1 = math.comb(fixed_num, num1)
temp2 = math.comb(fixed_num, num2)
temp3 = math.comb(fixed_num, num3)
# 假设 三种颜色都不一样
if num1 != num2 != num3:
return temp1 * temp2 * temp3 * math.perm(3, 3)
# 假设三种颜色都一样
elif num1 == num2 == num3:
return temp1 * temp2 * temp3 * math.perm(3, 0)
# 假设有两种颜色一样
else:
return temp1 * temp2 * temp3 * math.perm(3, 1)
- 计算概率
#计算概率
def CalculateProbability_result(denominator, molecule):
return float(molecule) / float(denominator)
- 计算所有可能出现的组合
#计算 可能 出现的组合
def CalculateProbability_combineNums(target):
lst = []
for i in range(0, target + 1):
for j in range(i, target + 1 ):
for k in range(j, target + 1):
if i + j + k == target :
lst.append([i, j, k])
return lst
完整代码
import math
# 计算分母
def CalculateProbability_denominator(all_nums, out_nums):
return math.comb(all_nums, out_nums)
#计算分子
def CalculateProbability_molecule(num1, num2, num3, fixed_num):
temp1 = math.comb(fixed_num, num1)
temp2 = math.comb(fixed_num, num2)
temp3 = math.comb(fixed_num, num3)
# 假设 三种颜色都不一样
if num1 != num2 != num3:
return temp1 * temp2 * temp3 * math.perm(3, 3)
# 假设三种颜色都一样
elif num1 == num2 == num3:
return temp1 * temp2 * temp3 * math.perm(3, 0)
# 假设有两种颜色一样
else:
return temp1 * temp2 * temp3 * math.perm(3, 1)
#计算概率
def CalculateProbability_result(denominator, molecule):
return float(molecule) / float(denominator)
#计算 可能 出现的组合
def CalculateProbability_combineNums(target):
lst = []
for i in range(0, target + 1):
for j in range(i, target + 1 ):
for k in range(j, target + 1):
if i + j + k == target :
lst.append([i, j, k])
return lst
def main():
target = 9
lst = CalculateProbability_combineNums(target)
for i in range(len(lst)):
num1 = int(lst[i][0])
num2 = int(lst[i][1])
num3 = int(lst[i][2])
fixed_num = 9
molecule = CalculateProbability_molecule(num1, num2, num3, fixed_num)
denominator = CalculateProbability_denominator(fixed_num * 3, fixed_num)
result = CalculateProbability_result(denominator, molecule)
result = result * 100
print(num1,num2,num3, '概率为: {:.6f}%'.format(result))