1. f1() = {1,2,3,4,5} f1提供一个等概率的返回一到五的方法 根据f1写出 1~7之间返回等概率的方法 2. a1() = {0, 1} 不等概率 求返回一个 等概率的方法

一、 f1() = {1,2,3,4,5} f1提供一个等概率的返回一到五的方法   根据f1写出 1~7之间返回等概率的方法。

        做这个类型的题目: 提供一个等可能范围、 根据提供的等可能范围求其它范围

        ① 根据提供的等可能范围求出一个 0 1 等可能

    /**
     * 构造出 f2 等概率返回 0 1
     *  f1 概率返回 1- 5 所以出现各个数的概率为 20%
     *  所以 1 - 2 的概率 共: 40% 4 - 5 的概率 共:40%
     *  当 ans == 3 时 就将3的概率分为四份 分给 1-2 和 4-5
     *  最后就会变成 1-2 出现的概率 50%   4-5 出现的概率 50%
     * @return
     */
    public static int f2(){
        int ans = 0;
        do {
            ans = f1();
        } while (ans == 3);
        return ans < 3 ? 0: 1;
    }

      ② 判断需要到求的范围 例: [x,y] 范围的等可能概率,我们可以构造出 [x-x,y-x] 也就是 [0,y-x]上的等可能,就可以得到我们想要的 [x, y]范围。

    /**
     * 根据 f2 构造出 1~7 等概率返回方法 g()
     * @return
     */
    public static int g(){
        int ans;
        do {
            /*
                f2() << 2 第三个二进制位
                f2() << 1 第二个二进制位
                f2()      第一个二进制位
                而三个二进制位组合成的 01 范围 000 ~ 111 也就是 0 ~ 7
            */
            ans = (f2() << 2) + (f2() << 1) + f2();
            /*
               ans == 0  将其平均分配给 1~7 则就能返回 1~7等概率随机数
             */
        }while (ans == 0);
        return ans;
    }

完整代码

package random;

/** 1. f1() = {1,2,3,4,5} f1提供一个等概率的返回一到五的方法
 *      根据f1写出 1~7之间返回等概率的方法
 *  2. a1() = {0, 1} 不等概率 求返回一个 等概率的方法
 * @author codelmh
 * @data 2021/12/6
 */
public class num {

    public static void main(String[] args) {

        int[] count = new int[8];
        int max = 1000000;
        for ( int i = 0; i < max; i++){
                count[g2()] ++;
        }
        for (int i = 0; i < count.length; i++){
            System.out.println("出现 " + i + "的概率" + (double)count[i]/max);
        }
    }

    /**
     * g2 等概率返回  0 1
     * @return
     */
    public static int g2(){
        int ans;
        do {
            ans = a1();
        } while (ans == a1());
        return ans;
    }
    /**
     * 不等概率返回  0 1
     * @return
     */
    public static int a1(){
        return Math.random() < 0.65 ? 0 : 1;
    }

    /**
     * 根据 f2 构造出 1~7 等概率返回方法 g()
     * @return
     */
    public static int g(){
        int ans;
        do {
            /*
                f2() << 2 第三个二进制位
                f2() << 1 第二个二进制位
                f2()      第一个二进制位
                而三个二进制位组合成的 01 范围 000 ~ 111 也就是 0 ~ 7
            */
            ans = (f2() << 2) + (f2() << 1) + f2();
            /*
               ans == 0  将其平均分配给 1~7 则就能返回 1~7等概率随机数
             */
        }while (ans == 0);
        return ans;
    }
    /**
     * 构造出 f2 等概率返回 0 1
     *  f1 概率返回 1- 5 所以出现各个数的概率为 20%
     *  所以 1 - 2 的概率 共: 40% 4 - 5 的概率 共:40%
     *  当 ans == 3 时 就将3的概率分为四份 分给 1-2 和 4-5
     *  最后就会变成 1-2 出现的概率 50%   4-5 出现的概率 50%
     * @return
     */
    public static int f2(){
        int ans = 0;
        do {
            ans = f1();
        } while (ans == 3);
        return ans < 3 ? 0: 1;
    }

    /**
     *  等概率返回 1 ~ 5
     * @return 1 ~ 5
     */
    public static int f1(){
        return (int) (Math.random() * 5) + 1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值