看的见的算法——你一定能中奖吗
这里有一个问题打开一个宝箱中奖的概率为20%问同时打开多少个必定能中奖?
我们的直觉告诉我们是5个但大家肯定知道这个是不对的那么我们拿程序看看:
package com.lipengge.canyouprize;
public class WinThePrizeExperiment {
private int win;
public WinThePrizeExperiment(int number,double chance,int frequency) {
play(number,chance,frequency);
}
public void play(int number,double chance,int frequency){
for(int i=0;i<frequency;i++){
if(run(number,chance)){
win++;
}
}
System.out.println((double)win/frequency);
}
public boolean run(int number,double chance){
for(int i=0;i<number;i++){
if(Math.random()<=chance){
return true;
}
}
return false;
}
public static void main(String[] args) {
new WinThePrizeExperiment(5,0.2,10000);
}
}
我们来看看结果:

同时打开5个箱子进行10000次实验中奖的概率为0.6811没有我们所期望的100%
那么这是为什么呢?我们中将的概率应该这样算:1-(不中奖的概率)^同时打开的箱子数量
由此还可以得出结论我们永远也无法得到100%的中奖率,由于编程语言随机数和精度的问题我们这个程序是可以达到100%的请注意