拿到最多金幣的概率
問題描述
在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