拿到最多金币的概率
问题描述
在10个房间每个房间里放随机数量的金币,每个房间只允许进入一次,金币只能拿一个房间的。
若一个人采取如下策略,问拿到最多金币的概率:先进入前4个房间,均不拿金币,之后每进入一个房间只要比前四个房间的金币都要多,就拿,否则拿取最后一个房间的金币。
编程模拟
import java.util.Random;
public class test {
/**
*
* @param n 房间个数
* @return 一次模拟情况下,能否拿到最多金币
*/
public static boolean getMax(int n){
if(n<1){
System.out.println("参数不合法!");
return false;
}
int i;
int a[] = new int[n];//n个房间
Random ran = new Random();
for ( i = 0; i < n; i++) {
a[i] = ran.nextInt(n)+1;//每个房间金币为1~n
}
int max = 0; //10个房间最大的金币数
for ( i = 0; i < n; i++) {
if(a[i]>max)
max = a[i];
}
int max4 = 0;//前4个房间的最大金币数
for ( i = 0; i < 4; i++) {
if(a[i]>max4)
max4 = a[i];
}
for(i=4;i<n-1;i++){ //后边房间金币数大于前4个房间最大值时拿取,并且这个金币数=10个房间最大的金币数时,返回true
if(i==9&&a[i]==max){ //最后一个房间直接拿取,并判断是否为最大值
return true;
}else{
if(a[i]>max4) {
if(max==a[i]){
return true;
}
return false;
}
}
}
return false;
}
public static void main(String[] args) {
int a =100000;
int suc =0;
for (int i = 0; i < a; i++) {
if(getMax(10)){
suc++;
}
}
System.out.println((double)suc/(double)a);
}
}
最后运算结果为0.326