1我一个同学电话面试阿里实习生遇到的一道概率题:
有个函数foo,返回0和1的概率都是50%,让你自己写一个函数,使返回0和1的概率分别是30%和70%。
这道题乍一看不知道咋下手,其实还很简单的,相当于利用了遗传算法的思想,每次产生一个数字,然后以为,一共产生四个数字,这样就可以得到一个四位的数字,即0~16,只要这个数字大于等于10就抛弃,这样产生0~9的数字,而且0~9的数字出现的概率是随机的,这样,0~2返回0,3~9返回1,这样,就满足了题目要求。
2 此题的反变换。有道题说的是有个函数foo,返回0的概率是60%,返回1的概率是40%,让你自己写一个函数,使返回0和1的概率是50%,
用前面说的foo函数实现,不能用像c++里面的rand这类的函数,怎么解?
网上看到某个牛人的答案,如下:
我的直觉,太简单了,调用foo两次即可,
连续两次,出现 0 1 和 1 0 的概率是一样的,于是就能构造出50%
(两次返回 0 0 或 1 1的结果丢掉,重新调用)
返回0 1 -> 当作 0
返回1 0 -> 当作 1
代码简单的要屎,如下
int half01() { while(1) { int a = foo(); int b = foo(); if(a != b) return a; } }