我在做一些评审时遇到了这个报道的面试问题(以下引用是我发现的关于这个问题的所有信息):
给定一个公平的硬币的功能,写一个有偏见的硬币的功能,返回头1/n次(n是一个参数)
乍一看我写道:
int biased_coin(n) { //0=Tails, 1=Heads
int sum = 0;
if(n==1)
return 1;
for(int i=0;i<n;i++) {
sum += unbiased(); //unbiased returns 0 50% of the time and 1 50% of the time
}
if(sum == 1)
return 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这显然不起作用.例如,对于n = 4,它确实起作用:因为给出4个投掷的单个头的概率是4 /(2 ^ 4)= 1/4.但是对于说n = 3,3 /(2 ^ 3)!= 1/3.
假设你不能使用随机数生成器,实现这样的东西的正确方法是什么?
puzzle ×1