【算法】随机数的转换

144 阅读1分钟

先看一个很常见的问题: f(x)是一个函数 可以等概率得到1-5,如何通过f(x)把1-7等概率返回?

先简单定义这个f()函数

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

如何把f()转换为1-7等概率的函数呢? 我们可以先尝试,把f()转换为 0 1 等概率。

如何转换呢?我们可以对这个函数返回的数字进行处理。 我们新定义一个用于对f()进行处理的函数f2() 假如f()返回1 、 2,则f2()返回0。若f()返回4、 5,则f2()返回1 。如果f2()返回3,则放弃本次随机数,重新随机一遍。 实现如下:

public static int f2(){
    int res;
    do{
        res = f();
    }while (res == 3);
    if(res == 1 || res ==2){
        return 0
    }
    return 1;
}

简单解释。已知函数f()的1-5是等概率返回,那么f2()返回1 、 2 和 返回 4 、5 也是等概率的,都是20%。所以此时f2返回1 0 也是等概率的。

我们为什么要追求1 0 是等概率的呢?因为 1 0 可以使用二进制来组合成任何我们所需要的十进制的数。

题目要求返回1 - 7等概率的数,那么,就可以去三个二进制位,最高表示8,含括了7在内。

实现如下:

public static int g(){
    int res = 0;
    do {
        res =(f2()<<2) + (f2() << 1) + (f2() <<0);
    }while (res == 7);

    return res + 1;

}