Math.random()相关问题

package class02;

public class Code02_RandToRand_v02 {
    public static void main(String[] args) {
        //1.手动打印看结果,Math.random()在[0, 1)范围上等概率返回一个double类型的小数。
        int testTimes = 10000000;
        int count = 0;
        double num = 0.7;//结果无限接近 0.7/1
        for (int i = 0; i < testTimes; i++) {
            if (Math.random() < num) {
                count++;
            }
        }
        System.out.println((double) count / testTimes);
        System.out.println("=========================");
        //2.Math.random() * K,在[0, K)范围上等概率返回一个double类型的小数。
        count = 0;//count归零
        int K = 7;
        num = 0.25;//结果无限接近 num/K
        for (int i = 0; i < testTimes; i++) {
            double ans = Math.random() * K;
            if (ans < num) {
                count++;
            }
        }
        System.out.println((double) count / testTimes);
        System.out.println((double) num / K);
        System.out.println("=========================");
        //3.(int) (Math.random() * K),在[0, K-1]范围上等概率返回一个int类型的整数。
        int[] arr = new int[K];
        for (int i = 0; i < testTimes; i++) {
            int n = (int) (Math.random() * K);
            arr[n]++;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.println(i + "出现的次数为:" + arr[i] + "次。");
        }
        System.out.println("=========================");
        //4.已知Math.random(),在[0, 1)范围上等概率返回一个double类型的小数,所以Math.random()的返回值,落在[0, x)范围上的概率是x。
        //请给出一个函数xChangeToXPower2(),使得它的返回值,落在[0, x)范围上的概率,是x的平方。
        double x = 0.2;
        count = 0;
        for (int i = 0; i < testTimes; i++) {
            if (xChangeToXPower2() < x) {
                count++;
            }
        }
        System.out.println((double) count / testTimes);
        System.out.println(Math.pow(x, 2));
        System.out.println("=========================");
        //第4题的推广:请给出一个函数xChangeToXPower3(),使得它的返回值,落在[0, x)范围上的概率,是x的立方。
        count = 0;
        for (int i = 0; i < testTimes; i++) {
            if (xChangeToXPower3() < x) {
                count++;
            }
        }
        System.out.println((double) count / testTimes);
        System.out.println(Math.pow(x, 3));
        System.out.println("=========================");
        /***
         * 5.给定一个f1()函数,在[7-26]上,等概率返回一个整数。
         * 求:根据f1(),得出一个g(),在[13-52]上,等概率返回一个整数。
         *
         * 思路:做出一个0和1等概率生成器(关键),再使用位运算(骚操作),看看最少几个2进制,可以涵盖39(因为52-13=39),
         * 发现2的6次方可以涵盖。因为2的6次方是大于39的最小的2的n次幂。
         * 则f3() return (f2() << 5) + (f2() << 4) + (f2() << 3) + (f2() << 2) + (f2() << 1) + f2();
         * 无限扩展:
         * 给定[a,b]范围上随机返回一个整数,求[c,d]上等概率返回一个整数。
         */
        int M = (52 - 13) + 1;
        arr = new int[M];
        for (int i = 0; i < testTimes; i++) {
            int g = g() - 13;
            arr[g]++;
        }
        for (int i = 0; i < M; i++) {
            System.out.println((i + 13) + "出现了" + arr[i] + "次");
        }
        System.out.println("=========================");
        //6.有一个函数x(),返回0或者1的概率固定,但不相等。(比如返回0的概率是0.84,或者0.3,或者0.11等等)
        //求函数y(),等概率返回0和1.
        arr = new int[2];
        for (int i = 0; i < testTimes; i++) {
            int y = y();
            arr[y]++;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.println(i + "出现了" + arr[i] + "次");
        }
    }

    /**
     * 该函数加工Math.random()后,将返回值落在[0, x)范围上的概率,由x变成了x的平方。
     * 即Math.random()的返回值,落在[0, x)范围上的概率为x。
     * xChangeToXPower2()的返回值,落在[0, x)范围上的概率为x的平方。
     */
    public static double xChangeToXPower2() {
        return Math.max(Math.random(), Math.random());
    }

    /**
     * 该函数加工Math.random()后,将返回值落在[0, x)范围上的概率,由x变成了x的立方。
     * 即Math.random()的返回值,落在[0, x)范围上的概率为x。
     * xChangeToXPower3()的返回值,落在[0, x)范围上的概率为x的立方。
     */
    public static double xChangeToXPower3() {
        return Math.max(Math.random(), Math.max(Math.random(), Math.random()));
    }
    //至此,可以推广出:求一个函数xChangeToXPowerN(),将Math.random()的返回值,落在[0, x)范围上的概率,由x变成了x的n次方。(n为已知条件,n是2,或者3,或者4)
    //推广解法:n是几,就取n-1次最大值。即就调n-1次Math.max()函数。

    //5.解start
    public static int f1() {
        return (int) (Math.random() * 19);
    }

    //0和1等概率生成器
    public static int f2() {
//        double ans;
//        do {
//            ans = f1();
//        } while (ans == 9);

        double num2 = 9;
        while (num2 == 9) {
            num2 = f1();
        }
//        return ans < 9 ? 0 : 1;
        return num2 < 9 ? 0 : 1;
    }

    public static int f3() {
        return (f2() << 5) + (f2() << 4) + (f2() << 3) + (f2() << 2) + (f2() << 1) + f2();
    }

    public static int f4() {
        int ans;
        do {
            ans = f3();
        } while (ans > 39);
        return ans;
    }

    public static int g() {
        return f4() + 13;
    }
    //5.解end

    //6.解start
    public static int x() {
        double x = 0.86;//比如x = 0.84。随便一个[0, 1)范围上的小数。
        return Math.random() < x ? 0 : 1;
    }

    public static int y() {
        int ans;
        do {
            ans = x();//第一次返回的值
        } while (ans == x());//第二次返回的值。如果两次一样(即,0 0,和1 1的情况),就重做。
        // 否则,就跳出,并返回。(返回的情况是0 1,或者1 0,概率分别是x*(1-x)和(1-x)*x,两者相等)
        return ans;
    }
    //6.解end
}
运行结果:
0.69991 ========================= 0.0356912 0.03571428571428571 ========================= 0出现的次数为:1429430次。 1出现的次数为:1428859次。 2出现的次数为:1429015次。 3出现的次数为:1428315次。 4出现的次数为:1427641次。 5出现的次数为:1427223次。 6出现的次数为:1429517次。 ========================= 0.0400365 0.04000000000000001 ========================= 0.0079441 0.008000000000000002 ========================= 13出现了250335次 14出现了249805次 15出现了249802次 16出现了251002次 17出现了250327次 18出现了249729次 19出现了249227次 20出现了250554次 21出现了249815次 22出现了249938次 23出现了249657次 24出现了249486次 25出现了249683次 26出现了249896次 27出现了251343次 28出现了248904次 29出现了249119次 30出现了249972次 31出现了250654次 32出现了250132次 33出现了249594次 34出现了249155次 35出现了250039次 36出现了250098次 37出现了250343次 38出现了250137次 39出现了249970次 40出现了249896次 41出现了249538次 42出现了250108次 43出现了249912次 44出现了250767次 45出现了249248次 46出现了250402次 47出现了250055次 48出现了250432次 49出现了250294次 50出现了250250次 51出现了250610次 52出现了249772次 ========================= 0出现了4999679次 1出现了5000321次

 

posted @ 2022-06-10 10:09  TheFloorIsNotTooHot  阅读(50)  评论(0)    收藏  举报