算法题:使得随机数出现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

 

posted @ 2022-02-28 09:21  gabin  阅读(241)  评论(0编辑  收藏  举报