一. 概率算法 概率算法(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]