2011年4月24日 星期日

模擬 St. Petersburg paradox 程式碼

import java.util.*;


class Petersburg {
 public static void main(String[] argv){
  Random rand = new Random();
  Scanner stdIn = new Scanner(System.in);
  double a1 = 2;
  int a2 = 0;
  System.out.println("輸入玩幾次");
  int n = stdIn.nextInt();
  System.out.println("輸入樣本數");
  int n1 = stdIn.nextInt();
  // int n = 64;
  double win = 0;
  double sum1 = 0;
  double sum2 = 0;
  
  double max = 0;
  double min = 0;
  for (int k=1; k<=n1; k++){
   sum1 = 0;
   for (int i=1; i<=n; i++){
double coin = rand.nextDouble();
/*
System.out.println("第" + i + "次玩");
System.out.println("隨機數" + coin);
*/
a1 = 2;
a2 = 0;
for (int j=1; a1>=coin; j++){
 a1 = Math.pow(2,-j);
 //System.out.println(a1);
 a2 = j;
}
 
win = Math.pow(2,a2-1);
sum1 = sum1 + win;
/*
System.out.println("第" + a2 + "回才丟出來"); 
System.out.println("機率" + Math.pow(2,-a2));
System.out.println("贏了" + win + "元");
System.out.println("累計贏了" + sum1);  
System.out.println("===========================");
*/
   }
   //System.out.print("玩" +n + "次共贏了" + sum1 + "元    ");
   //System.out.println("平均每回獲利" + sum1 + "/" + n + "=" + (sum1/n));
   //System.out.println("===========================");
   //System.out.println("===========================");
   sum2 = sum2 + sum1;
   if (k == 1){
min = sum1;
max = sum1;
   }
   if (sum1 < min) min = sum1;
   if (sum1 > max) max = sum1;
  }
  System.out.println("==================================");
  System.out.println("平均每樣本獲利" + sum2 + "/" + n1 + "=" + (sum2/n1));
  System.out.println("平均每次獲利" + (sum2/n1) + "/" + n + "=" + (sum2/n1/n));
  System.out.print("max" + max + "    ");
  System.out.println(max + "/" + n + "=" + (max/n));
  System.out.print("min" + min + "    ");
  System.out.println(min + "/" + n + "=" + (min/n));
  System.out.println("max/min = " + (max/min));
 }
}

沒有留言:

張貼留言