先看一个很常见的问题: 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;
}