一. 概率算法 概率算法(Randomized algorithm)
二. 三门问题 1.题目描述 
2.代码 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 public class ThreeDoor {     public static void main(String[] args) {         int trial_num = 10000;         int change_revenue;         int no_change_revenue;         //选手没有改变选择的情况下,10000次下成功的概率         no_change_revenue = 0;         for (int i = 0; i < trial_num; i++) {             int real = new Random().nextInt(3);             int choose = new Random().nextInt(3);             if (real == choose){                 no_change_revenue = no_change_revenue + 1;             }         }         //选手改变选择的情况,10000次下成功的概率         change_revenue = 0;         for (int i = 0; i < trial_num; i++) {             int real = new Random().nextInt(3);             int choose = new Random().nextInt(3);             if (real != choose){                 change_revenue = change_revenue + 1;             }         }         System.out.println("Change revenue:"+change_revenue+"; not change revenue:"+no_change_revenue);     } } //某次的运行结果 Change revenue:6714; not change revenue:3266 
三. 相亲问题 1.题目描述 
2.代码 
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 public class SecretaryProblem {     /**      * 检查某一次相亲是否选中最佳的人      */     private static boolean check_success(double[] candidates, int stop_time){         double max_in_observation = 0;         double choosen = 0;         //观察选出stop_time之前条件最好的人         for (int i = 0; i < stop_time; i++) {             if (candidates[i] > max_in_observation){                 max_in_observation = candidates[i];             }         }         //stop_time之后,只要遇到条件超过之前观察的就选它为相亲对象         for (int i = stop_time; i < candidates.length; i++) {             if (candidates[i] >= max_in_observation){                 choosen = candidates[i];                 break;             }         }         //找到stop_time之后,真正条件最好的人         double max_in_all = max_in_observation;         for (int i = stop_time; i < candidates.length; i++) {             if (candidates[i] >= max_in_all) {                 max_in_all = candidates[i];             }         }         //比较得到结果         if (choosen == max_in_all) return true;         else return false;     }     /**      * 测试程序      * @param args      */     public static void main(String[] args) {         //实验次数         int trial_num = 1000000;         //一组相亲的次数         int n = 20;         //对应成功的次数         int[] success_times = new int[n];         for (int i = 0; i < trial_num; i++) {             //生成一组相亲数据             double[] candidates = generateRandomNumbers(n);             //判断每一种选择的成功次数             for (int stop_time = 0; stop_time < n; stop_time++) {                 if (check_success(candidates,stop_time)){                     success_times[stop_time]++;                 }             }         }         System.out.println(Arrays.toString(success_times));     }     /**      * 生成一组随机数      * @param n      * @return      */     private static double[] generateRandomNumbers(int n) {         double[] randoms = new double[n];         for (int i = 0; i < n; i++) {             double v = new Random().nextDouble();             randoms[i] = v;         }         return randoms;     } } //某次的运行结果 [49864, 177246, 254832, 307353, 343039, 365779, 378529, 383169, 380892, 372516, 358383, 339562, 316130, 288496, 257085, 222080, 183753, 141744, 97207, 49862]