我在一个随机问题中遇到麻烦:)
例如一个随机算法A,想确定输入X是否为正数?
首次运行
1-如果x是素数 - >算法A回答“是”
2-如果x不是素数 - >算法A的概率为3/4,答案为NO。
我们应该运行多少次A(最小运行次数),如果我们想保证在第二状态(2)算法A答案NO的概率至少为1-(1 / k)?
注意:一个没有答案意味着输入X不是素数。
有什么想法吗?
答案 0 :(得分:2)
如果数字x
不是素数,则产生“是”的概率为“0”。在n
重复的算法中(1/4)^n = 4^(-n) = 2^(-2n)
。
所以,如果你想要实现1-(1/k)
,你实际上是在寻找误判,概率最多为1/k
,并且从上面我们想要:
2^(-2n) <= 1/k //log_2 on both sides:
-2n <= log(1/k) = log(1)-log(k) = 0 - log(k)
2n >= log(k)
n >= log(k)/2
因此,您希望选择n
这样的最小整数n >= log(k)/2
,以保证 True Negative 的概率为1-1/k
。
(注意:所有log()
都有基数2)。
示例:强>
如果你想在99%的时间内保持正确,那么你实际上正在寻找1-1/k=0.99
,所以1/k=1/100
和k=100
。
现在,根据上面的公式,请注意log_2(100) ~= 6.64
,因此最小n
,n >= log_2(100)/2
是n==4
。
意思是,你需要重复算法4次才能达到99%。
让我们检查一下是否正确:
1-(1/4)^4 = 1-(1/256) ~= 0.996 >= 0.99
,所以概率很好。1-(1/4)^3 = 1-1/64 ~= 0.984 < 0.99
- 所以我们会因n==3
而失败。