算法题:使得随机数出现0~X之间的概率从X变为X平方
1、先证明随机数出现0~X的概率是X
public static void main(String[] args) { for (int i = 1; i < 10; i++) { test(i / 10d); } } public static void test(double x) { int count = 0; int size = 10000; for (int i = 0; i < size; i++) { if (Math.random() <= x) { count++; } } System.out.println(x + "区间内出现的概率:" + (count * 1.0 / size)); }
控制台:
0.1区间内出现的概率:0.0992 0.2区间内出现的概率:0.2015 0.3区间内出现的概率:0.3023 0.4区间内出现的概率:0.3938 0.5区间内出现的概率:0.5021 0.6区间内出现的概率:0.5979 0.7区间内出现的概率:0.6958 0.8区间内出现的概率:0.7983 0.9区间内出现的概率:0.8993
2、分析X平方概率的意思,首先0~1之间,前闭合后不闭(前包后不包)。所以除了0,其他都是小数。
小数的平方会比原值更小,也就是说这个概率是变小了
3、X的平方,相当于出现了两次随机数行为,并且两次都需要满足一定的条件
4、条件的区间是0~X,也就是说要使得出现两次随机数的行为,同时(&&)满足出现在区间0~X之间
5、反向思维,两次随机数行为都出现在区间0~X之间。即可等价为至少一次随机数行为出现在X~1之间
6、两个数之间至少有一个数满足一定条件,则可取MAX。相当于至少要有1次随机数大于X才满足
7、从结果再反推,MAX要出现在0~X区间,则必须两次随机数都在0~X区间,单次随机数出现在区间的概率是X,则两次都满足的情况下是X*X,即X的平方
8、代码验证
public static void main(String[] args) { for (int i = 1; i < 10; i++) { test(i / 10d); } } public static void test(double x) { int count = 0; int size = 10000; for (int i = 0; i < size; i++) { if (Math.max(Math.random(), Math.random()) <= x) { count++; } } System.out.println(x + "区间内出现的概率:" + (count * 1.0 / size)); }
控制台:
0.1区间内出现的概率:0.0112 0.2区间内出现的概率:0.0411 0.3区间内出现的概率:0.092 0.4区间内出现的概率:0.1554 0.5区间内出现的概率:0.2516 0.6区间内出现的概率:0.3593 0.7区间内出现的概率:0.4917 0.8区间内出现的概率:0.6451 0.9区间内出现的概率:0.8096