看的见的算法——你一定能中奖吗
这里有一个问题打开一个宝箱中奖的概率为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%的请注意