某玩家声称:
虽然已经大学毕业数年,但直觉告诉我不太对劲。众所周知直觉往往不一定靠谱,所以还是科学论证一下。
由于该玩家统计时把野良一脚踢出了池子那我们也就当池子里没有野良。池子一共8个人形,除去野良是7个。那我们抽四个金,每个都是这七个人形之一的概率是100%。这句其实是废话,但也是前提。
假设七种人形对应ABCDEFG。那我们每次抽取一共有7种可能性,4次抽取就是7的四次方2401种可能性。四次都是同一人形有7种排列组合即AAAA BBBB CCCC DDDD EEEE FFFF GGGG。概率为7/2401=1/343≈0.29%
那如果我们是欧皇,抽出4个不同人形的概率是多少呢。我们第一次抽的结果有七种不同情况,第二次抽要与第一次不同那有除去第一次抽取结果的6种情况,以此类推总排列组合为7*6*5*4=840种排列组合。概率为840/2401≈35%
为方便大家理解附上一张3选3的图,7选3有840可能性,不太好示范
三选三的组合数为3*2*1=6
甚至我们可以将它写成程序
public List<List<Integer>> permute(List<Integer> nums) {
List<Integer> current = new ArrayList<>(nums);
List<List<Integer>> res = new ArrayList<>();
backtrack(current, 0, res);
return res;
}
// current[0..m) 是已选集合, current[m..N) 是候选集合
void backtrack(List<Integer> current, int m, List<List<Integer>> res) {
if (m == current.size()) {
res.add(new ArrayList<>(current));
}
// 从候选集合中选择
for (int i = m; i < current.size(); i++) {
// 选择数字 current
Collections.swap(current, m, i);
// 注意:这里传入参数是 m+1,而不是 i+1
backtrack(current, m+1, res);
// 撤销选择
Collections.swap(current, m, i);
}
}
上面是给定一个不重复的数字集合,返回其所有可能的全排列程序范例。
单纯学术交流,防止大家接受错误信息