等概率问题

题目

给定一个函数f1(),相当于这是lib库里的函数,等概率返回[3-19]。

利用这个给定的函数f1(),实现一个函数g(),等概率返回[17,56]

思路

要实现一个函数g()等概率返回[17,56],那么得先实现一个函数f4()等概率返回[0,39],再加17。

那么如何利用题目给定的函数f1()等概率返回[3-19],实现函数f4()等概率返回[0,39]呢。

我们可以先利用函数f1()实现一个函数f2(),等概率返回0和1.

再利用函数f2()实现一个函数f3(),等概率返回[0,39]. 运用二进制左移可以实现。

代码实现如下
public class Test {
    public static void main(String[] args) {
        int[] counts = new int[57];
        int testTimes = 10000000;
        //int count = 0;
        for (int i = 0; i < testTimes; i++) {
            int num = g();
            counts[num]++;
        }
        for (int i = 17; i < 57; i++) {
            System.out.println(i + "这个数,出现了 " + counts[i] + " 次");
        }
    }

    //等概率返回[3-19]
    public static int f1() {
        return (int) (Math.random() * 17) + 3;
    }

    //  等概率返回0和1
    public static int f2() {
        int ans;
        do {
            ans = f1();
        } while (ans == 11);
        return ans < 11 ? 0 : 1;
    }

    /**
     * 得到 000000~111111做到等概率  0~63
     * 每次调用f2()函数得到0或1的概率都是1/2,
     * 那么六次单独调用f2()函数(每次左移一位)得到00000~111111的概率为六个二分之一相乘,那么也是等概率的
     * @return
     */
    public static int f3() {
        return (f2() << 5) + (f2() << 4) + (f2() << 3) + (f2() << 2) + (f2() << 1) + f2();
    }

    //得到 0~39等概率,f3()返回的值大于39我就重做
    public static int f4() {
        int ans = 0;
        do {
            ans = f3();
        } while (ans > 39);
        return ans;
    }

    //得到17~56等概率
    public static int g() {
        return f4() + 17;
    }

}

测试结果如下

17这个数,出现了 25024118这个数,出现了 25091119这个数,出现了 24915520这个数,出现了 24931121这个数,出现了 25010122这个数,出现了 24941323这个数,出现了 24996724这个数,出现了 25054225这个数,出现了 25017026这个数,出现了 25068627这个数,出现了 25013628这个数,出现了 24979729这个数,出现了 25023730这个数,出现了 25003731这个数,出现了 24975332这个数,出现了 24999733这个数,出现了 25037234这个数,出现了 25011635这个数,出现了 25007236这个数,出现了 24915237这个数,出现了 25074838这个数,出现了 24943439这个数,出现了 24941540这个数,出现了 24959341这个数,出现了 24978642这个数,出现了 24916743这个数,出现了 25044844这个数,出现了 25001645这个数,出现了 24940046这个数,出现了 25038147这个数,出现了 24992248这个数,出现了 25020249这个数,出现了 25025450这个数,出现了 24978451这个数,出现了 25022852这个数,出现了 24983153这个数,出现了 25031554这个数,出现了 25031855这个数,出现了 25023056这个数,出现了 250362
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值