这是一个面试问题,我一点也不知道该怎么解决。面试结束了,但我真的很想看看他们在找什么。我试图在某种程度上混淆这一点,以尊重公司的要求。在
有一个秘密整数S
,由N
位组成。我们的工作是以非常高的确定性来猜测这个秘密整数。在
我们只能通过一个秘密方法foo(G)
来访问foo(G)
,该方法接受一个猜测G
和一个随机生成的值V
,其中{
foo(g):
generate v
return bin(g ^ v ^ s).count('1')
每次调用V
时生成V
我们只能在面试失败之前,或者在世界爆炸或其他事情之前,尝试运行foo
100000次。在
我们该怎么做?在
让我抓狂的是,即使是猜测正确的答案,从foo
返回非零值的几率也只有十分之一。所以即使是暴力的尝试也不可能。在
假设:如果用相同的G重复函数
foo(G)
足够多次,foo(G)
的平均结果将足够接近期望值。在例如,假设}的期望值将是
S
有N个位,其中M是1,让G = N bits of 0
,那么{E(N,M)=M*0.9 + (N-M)*0.1
。因为我们知道N,我们可以得到foo(G)
的平均值,所以很容易计算出M的个数,实际上我们甚至不需要计算M当我们有了数字}的第i位等于0,
E(N,M)
,那么剩下的就很简单了:迭代i到N,使G的第i位等于1,而其余的都是零,然后重复foo(G)
足够大的次数。如果s
的第i位等于1,那么foo(G)
的期望值将是E(N-1,M-1)+0.1=E(N,M)-0.8
,否则,如果{foo(G)
的期望值将是E(N-1,M)+0.9=E(N,M)+0.8
。在然后你最终可以算出
S
的值。在同一个G上重复foo(G)
的次数越多,就越有把握。在一些示例代码:
我可以这样做:
输出示例(N=8,S=123,stop iu iter=100,N=10):
^{pr2}$示例输出(N=20,S=12345,stop iu iter=100,N=10)
^{3}$基本上是迭代优化,通过比较当前猜测的N个扰动版本,试图使
error
项尽可能接近于零。因为有噪音,这会比平常更棘手。在还有一些参数可以调整,两个
test_
函数中的n
默认参数,以及迭代次数stop_iter
。在相关问题 更多 >
编程相关推荐