我觉得这个问题不是考察面试者的coding的,而是考察脑筋急转弯。
给定一个函数f(),如果返回0的概率是p,返回1的概率是1-p (p是0到1之间的数),
如何根据f()函数构造一个g()函数使得其返回0或者1的概率都是50%?
如果是第一次接触这个题目的话估计不知道从何下手,本来那种不知道如何下手但是知道之后大呼太简单的题目都说明题目有问题——因为好的问题是应该可以给解题者一个正常的可解决的方案然后可以不断优化解题者的方案的才是好题目,谁优化的最好谁是最佳答案而不是大家连一个正常的可解决方案都没有然后就答案公布之后也没有其他优化的方案。
加一点提示
如果f()方法执行2次有哪些排列组合呢?
0 0 p*p
0 1 p*(1-p)
1 0 (1-p)*p
1 1 (1-p)*(1-p)
排列组合结果出来之后我们发现当出现结果是01和10的时候概率是一样的,均为p*(1-p),我刚开始还在疑惑为什么不管00 11 这两种执行结果,真的是当局者迷——因为题目只要你返回相同的概率并不关心这些执行
public int g(){
while (true){
int a = f();
int b = f();
if(a!=b){
return a;
}
}
}
在这里补充解释一下,g方法只有在a,b两个返回值不一样的时候才会出现,那么ab怎么会两个不一致的呢?
a=0 b=1或者b=0 a=1 这两种情况出现的概率是相等的,所以g返回的结果取决于2种情况(01 10),而这两种情况返回概率是相同的,那么就可以说明g函数返回概率是相同的
最后虽然我弄懂了但是我还是想说这个题目和编程有半毛线关系么???不应该是逻辑思维脑筋急转弯或者概率的知识么???