1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
import java.util.*; /* 60%を3回試行と80%を2回試行ではどちらの期待値が高いか */ public class Main { public static void main(String[] args) throws Exception { int n = 2000000; double result60 = Util.pパーセントの確率にt回挑戦したときに1回以上成功した割合_試行回数n(60, 3, n); double result80 = Util.pパーセントの確率にt回挑戦したときに1回以上成功した割合_試行回数n(80, 2, n); double result60Analitical = Util.pパーセントの確率にt回挑戦したときに1回以上成功した割合_解析解(60, 3); double result80Analitical = Util.pパーセントの確率にt回挑戦したときに1回以上成功した割合_解析解(80, 2); System.out.println("計算解60 : " + result60 + ", 解析解 : " + result60Analitical); System.out.println("計算解80 : " + result80 + ", 解析解 : " + result80Analitical); } } class Util { public static Random random = new Random(); public static double pパーセントの確率にt回挑戦したときに1回以上成功した割合_解析解(double percent, int times){ double analyticalSolution = 100.0 - Math.pow(1 - percent / 100.0, times) * 100; return analyticalSolution; } public static double pパーセントの確率にt回挑戦したときに1回以上成功した割合_試行回数n(double percent, int times, int n) { int cnt = 0; for(int i=0; i<n; i++){ if(pパーセントの確率にt回挑戦して1回でも成功したらtrueを返す(percent, times)){ cnt++; } } double proportion = cnt * 100.0 / n; return proportion; } public static double _0より大かつ100より小の少数を返す() { return random.nextDouble() * 100; } public static boolean pパーセントの確率に1回挑戦した結果を返す(double percent) { return _0より大かつ100より小の少数を返す() < percent; } public static boolean pパーセントの確率にt回挑戦して1回でも成功したらtrueを返す(double percent, int times) { for(int i=0; i<times; i++){ if(pパーセントの確率に1回挑戦した結果を返す(percent)){ return true; } } return false; } } |
1 2 |
計算解60 : 93.58305, 解析解 : 93.6 計算解80 : 96.00985, 解析解 : 96.0 |