算法题:1~5随机数函数转化成1~7的随机函数(等概率)

1、1~5随机函数

  public static int sourceFunc() {
        return (int) (Math.random() * 5) + 1;
    }

2、将原函数转化为[0,1]返回值的函数

    public static int tmpFunc() {
        int i = sourceFunc();
        if (i < 3) {
            return 0;
        } else if (i > 3) {
            return 1;
        } else {
            return tmpFunc();
        }
    }

3、目标函数(二进制算法,000为0,111为7,所以0~7是三个二进制位)

    public static int targetFunc() {
        return (tmpFunc() << 2) + (tmpFunc() << 1) + tmpFunc();
    }

4、证明是等概率的

     public static void main(String[] args) {
        int size = 1000000;
        for (int i = 0; i < 7; i++) {
            int count = 0;
            for (int j = 0; j < size; j++) {
                if (targetFunc() == i) count++;
            }
            System.out.println("出现" + i + "的概率为:" + (count * 1d / size));
        }
    }

  控制台:

出现0的概率为:0.125118
出现1的概率为:0.125029
出现2的概率为:0.124792
出现3的概率为:0.125041
出现4的概率为:0.125122
出现5的概率为:0.124823
出现6的概率为:0.12527

 

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