借用一个给定概率的概率函数实现自定义概率的概率函数

借用一个给定概率的概率函数实现自定义概率的概率函数

给定一个等概率随机生成数字为1 - 7的函数fun7(),要求只借用此函数封装一个实现等概率生成1 - 10的函数fun10(),或者等概率生成1 - n的函数funN();

思路

fun2()函数

将所有的数都拆成二进制来做,首先要将给定的函数改造成实现等概率出现0、1的函数。

将函数fun7()生成的结果做分类判断,若结果为1 - 3则为0,若结果为4 - 6则为1;结果为7则重新调用函数。

funN()函数

将需要生产的n拆成二进制形式,例如10:需要用4位二进制形式的数。

对二进制上的每一位进行随机:由于4位二进制形式的数,可以随机生成0 - 15的数,规定10 - 15的数重新进行随机,即可以做到0 - 9的随机生成,+1则可以实现1 - 10范围内的数随机生成。

实例Demo

package pro.eddievim.algorithm;

import java.util.Random;

/**
 * @author eddieVim
 * @微信公众号 埃迪的Code日记 / PositiveEddie
 * @blog https://blog.csdn.net/weixin_44129784
 * @create 2020/8/28 9:23 上午
 */
public class RandToRand {
     

    public static void main(String[] args) {
     
        RandToRand randToRand = new RandToRand();
        int[] arr = new int[10];

        for (int i = 0; i < 1000000; i++) {
     
            arr[randToRand.fun10() - 1]++;
        }

        for (int x : arr) {
     
            System.out.print(x + "\t");
        }
    }

    /**
     * 给定函数,等概率return 1 - 7
     * @return
     */
    public int fun7() {
     
        return new Random().nextInt(7) + 1;
    }

    /**
     * 借用fun7()改造,等概率返回0、1
     * @return
     */
    public int fun2() {
     
        int x = 7;
        while (x == 7) {
     
            x = fun7();
        }
        return x <= 3 ? 0 : 1;
    }

    /**
     *  借用fun2()改造,等概率返回 1 ~ 10
     * @return
     */
    public int fun10() {
     
        int x = 10;
        while (x >= 10) {
     
            int newNum = 0;

            for (int i = 0; i < 4; i++) {
     
                if (fun2() == 1) {
     
                    newNum += Math.pow(2, i);
                }
            }

            x = newNum;
        }
        return x + 1;
    }

}

运行结果:

100405	100149	99577	100088	99480	99937	100159	100359	99726	100120	

多次测试结果均较为接近,可以判断为等概率。

你可能感兴趣的:(算法,算法,random)