面试题:从1-5随机到1-7随机
题目
给一个函数f1()等概率返回[1,5]之间的整数。在不修改f1()函数的情况下,如何借助f1()函数实现[1,7]等概率随机函数?
已知 f1()函数代码如下:
// 等概率返回[1,5] ,固定函数,不允许修改
public static int f1() {
return (int) (Math.random() * 5) + 1;
}
解题思路
1、根据f1()函数可以得到等概率返回 [0,1]之间的函数;
2、然后把7转换成二进制为:111 ; 根据等概率[0,1] 表示二进制可以得到等概率[0,7]
3、把出现7的概率平摊到[0,6]上,得到等概率[0,6]
4、等概率[0,6] + 1 ,得到等概率[1,7]
充分利用二进制,可以得到[0,n]之间的等概率; [0, n-x]等概率可以利用平摊法。即[0,n] 生成的数字>n-x , 重新生成即可
步骤如下:
1、根据 f1() 得到等概率返回 [0,1] 的函数 f2()
// 等概率返回[0,1]
public static int f2() {
int ans = 0;
do {
ans = f1();
}