目录
Summary
如果你遇到的问题,自己不确定是排列还是组合,但确定想求出摆放的全部方式,那么可以用逐步分析法。
- 0.首先确定这个问题的次序重要不?
- 1.重要
- 重要就用排列,然后继续确认能重复吗?
- 1.1 重复排列
- 公式:\(n^{r}\)(n 是被选择的东西的个数,而我们要选 r次)
- 1.2 不重复排列
- 公式:P(n,r)
- 1.1 重复排列
- 重要就用排列,然后继续确认能重复吗?
- 2.不重要
- 不重要就用组合,然后继续确认能重复吗?
- 2.1 重复组合
- 公式:H(n,r)
- 2.2 不重复组合
- 公式:C(n,r)
- 2.1 重复组合
- 不重要就用组合,然后继续确认能重复吗?
- 1.重要
Reference
https://www.shuxuele.com/combinatorics/combinations-permutations.html
Online Tool
https://gadget.chienwen.net/x/math/percomb
Cracking the Safe!
If you will to cracking a safe, password just four , each-password have 0 to 9 probability , Can you crack the safe?
Notice:
- Passwords 1100 and 0011 are different!
这个密码排列的特征是:
- 次序重要
- 可重复
那么就选重复排列方式计算即可。
Code:
import itertools
product_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
product = list(itertools.product(product_list, repeat=4))
print("product number :", len(product))
print("product list: ", product)
# out:
product number : 10000
product list: [(1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 3), (1, 1, 1, 4) ... ]
计算比赛前三名有多少种排列方式?
有一场比赛,分别有 A,B,C,D,E,F,G,H 共8支队伍参加,现在想算前三名的排列情况有多少种?
Notice:
- If "A" comes first, it cannot come second .
这个名次排列的特征:
- 次序重要
- 不可以重复
就选不重复排列方式计算即可。
from itertools import permutations
itering = permutations(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'], 3)
plist = list(itering)
print("前三名的排列有多少种: ", len(plist))
print("permutations list: ", plist)
# out
前三名的排列有多少种: 336
permutations list: [('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'B', 'E'), ('A', 'B', 'F'), ... ]
Can you win the lottery?
假设彩票的玩法是从编号为01~33个球中随机抽出6个,顺序不重要。你选6个数组合成一注彩票,如果所选的6个号码都中了,就表示你中了1等奖。
那么有多少种组合情况?
Notice:
- If you take the ① ball, you won't be able to take the ① ball later.
这个中奖号码组合的特征:
- 次序不重要
- 不可重复
用不可重复组合求即可。
from itertools import combinations, permutations
from scipy.special import comb, perm
C = comb(33, 6)
# out: C = 3.0
print("combinations number: ", C)
itering = combinations(
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33], 6)
Clist = list(itering)
with open('temp.txt', 'w') as f:
for i in Clist:
f.writelines(str(i) + "\r")
# out:
combinations number: 1107568.0
out:
How make a pill?
假设有个神仙要你用5种材料('人参', '萝卜', '火龙果', '鹿茸', '熊掌')做一个仙丹,需要按照一种特定的配方,但是配方不告诉你,只告诉你做的规则,顺序无所谓,需要配3种材料,可以有重复。
你知道你要尝试多少次才能找到配方做出仙丹?
Notice:
- 食材摆放位置不影响结果,比如说 煮('人参', '鹿茸', '熊掌') 或者 煮('熊掌', '鹿茸', '人参') 出来的丹都是一样的。
这个配方组合的特征:
- 次序不重要
- 可重复
用重复组合求即可。
import itertools
c_list = ['人参', '萝卜', '火龙果', '鹿茸', '熊掌']
clist = list(itertools.combinations_with_replacement(c_list, 3))
print("一共有多少种组合: ", len(clist))
print("List: ", clist)
#out:
一共有多少种组合: 35
List: [('人参', '人参', '人参'), ('人参', '人参', '萝卜'), ('人参', '人参', '火龙果'), ('人参', '人参', '鹿茸'), ('人参', '人参', '熊掌')...]
Think
Do you know any other application scenarios?