家庭作业:每次调用返回两个值之一的函数

时间:2011-05-14 18:18:36

标签: algorithm

我正在尝试编写一个函数,每次调用它时都会返回true或false,但是有一个已知的频率,比如60%的时间它是真的,另外40%它会是假的。使用该函数我将创建另一个函数,该函数在50%的时间内返回true。

我最初的方法是使用随机函数,如果低于0.6则返回true,如果结束则返回false。不知道如何使用它接近第二部分。

4 个答案:

答案 0 :(得分:12)

我们来看一般情况: 你建立了一个函数F1(),它以概率P返回True(在你的情况下,P = 60%)。 现在你用这种方式构建第二个函数:

F2():
   result1 = F1()
   result2 = F1()
   if result1 = True and result2 = False: return True
   elif result1 = False and result2 = True: return False
   else:  F2()

在这种情况下,运行F1两次并获得(True,False)的概率与获得(False,True)相同,并且它是P *(1-P)。相反,如果你得到(True,True)或(False,False),你可以递归地调用F2。这意味着,在运行F2之后,你总是以1/2的概率获得真或假,因为前两个分支具有相等的概率,而第三个总是给你一个具有1/2概率的函数的结果。

我正在制作这个社区维基,以防有人想让我的答案更清楚。我意识到解释这个概念可能有点难。

平均通话次数

函数F2()在n次递归调用之后立即终止的概率为:

  

{(1-P)^ 2 + P ^ 2} ^ N * 2P(1-P)

因此,所需的平均递归调用次数为:

  

\ Sum_ {i = 0} ^ \ infty i * {(1-P)^ 2 + P ^ 2} ^ i * 2P(1-P)

答案 1 :(得分:0)

好的,我们有一些函数可以生成p值为0.60的True值和p = 0.40的False值。假设我们一次运行这个函数两次?结果的概率是多少。

所以F_1 == true和F_2 == true发生在p(0.60 * 0.60)= 0.36

和F_1 == false和F_2 == false发生在p(0.40 * 0.40)= 0.16

和F_1!= F_2以p(0.6 * 0.4 + 0.6 * 0.4)= 0.48

发生

这会给你一个函数,返回时间为0.52%,这不是我们想要的但很有趣。

一个非常简单的解决方案就是说:如果我有60%的时间是真的,那么我应该将该值的百分比变为假,以便在50%的时间内变为真

这就是我要说的全部内容。

答案 2 :(得分:0)

方法:

你运行你的40/60功能,直到你达到返回40%概率的结果。 一旦发生这种情况,您就会计算结果。

以这种方式计算

0.5。

0.5 = 0.6 - 0.6 ^ 2 + 0.6 ^ 3 + 0.6 ^ 4 - 0.6 ^ 5 - 0.6 ^ 6 + 0.6 ^ 7 + 0.6 ^ 8 - 0.6 ^ 9 + ....
(如果当前结果大于0.5,则添加其他减去)

一旦达到0.4,就计算出这个函数的结果。如果是> 0.5你返回true,否则你返回false。

答案 3 :(得分:0)

嘿,这个方法怎么样: 我们知道调用F1()10次:6次,它将返回true,4次返回

所以在F2()中我们可以有一个计数到5的计数器。每次调用F1()我们都会递增计数器。 F2()返回F1()返回的内容。当计数器达到5时F2()返回“false”并重新初始化计数器。 怎么说?