【问题标题】:Looking for New Ideas on An Old Interview Trick [closed]寻找关于旧面试技巧的新想法 [关闭]
【发布时间】:2011-10-18 13:31:35
【问题描述】:

原来的问题是:

描述一个输出掷骰子的算法(一个从 1 到 6 的随机数),给定一个输出掷硬币的函数(一个从 1 到 2 的随机数)。每个可能的结果都应该是同样可能的。

这个问题最流行的答案是:

掷硬币三次,将掷出的三个硬币作为一个三位数字的位。如果数字在 1 到 6 的范围内,则输出该数字。否则,重复。

我的问题是:

关于 Stack Overflow 的大多数讨论都属于上述类型。我还搜索了互联网,发现存在许多其他口味的答案,他们没有明确挖掘。有人可以就这个问题分享一两个不同的想法吗?

【问题讨论】:

  • 有一个相当基本的水平,问题在于使用 2 个不同符号的序列来表达六件事。那么如何定义“味道”呢?两种最常见的方法是这种方法(仅使用 8 个可能的 3 序列中的 6 个),以及一种基于将六分之一表示为(非终止)二进制分数的方法。它们有不同的味道吗?
  • 是上个月的Ponder this 问题的一部分吗? :-)
  • 这件事被关闭了。这显然是一个关于软件算法的问题,因此是一个主题。
  • @KeithIrwin:我认为问题在于问题是要求一种替代算法,用于一种被广泛认为是这种情况下可能的最佳算法的算法。这对我来说似乎有点模糊......

标签: algorithm random probability


【解决方案1】:

对“投掷 3 次并丢弃 110 或 111”算法有一个小的改进。丢弃 110 或 111 是一种浪费,因为您浪费了一个可以重复使用的非常好的熵。其中一个值弹出后,只需要折腾两次,从映射{110->tails, 111->heads}中得到第三次折腾的值。 110 和 111 的可能性相同,因此您不会以这种方式引入任何偏差。

在伪代码中:

bit0 = toss()
while True:
   bit1 = toss()
   bit2 = toss()
   if bit1,bit2,bit3 give i such that 0<=i<=5 then 
      return i+1
   else
      bit0 = bit3 // the reuse happens here

这里的预期投掷次数是 1 + 2 * expected_number_of_loop_executions = 1+2*8/6 = 11/3

【讨论】:

  • 在原始情况下,平均抛硬币是 4。在这个改进的情况下,它是 11/3≈3.67
  • @Dialectus:谢谢,我会把它添加到答案中。
  • 或者你可以表达它do { bit0 = toss(); bit1 = toss(); } while (bit0 and bit1); bit2 = toss(); return 1 + bit2 + 2*bit1 + 4*bit0;。应该是相同的预期投掷次数,但避免了有点混乱的重复使用。
  • @SteveJessop:我相信这可以被视为一个不同的想法,即模拟一个 3 面骰子,然后是单独的掷硬币。这需要一个单独的答案,恕我直言。
  • @RafałDowgird:我实际上只是通过注意到当且仅当前两位为 1 时才会丢弃 3 位结果,因此我们可以决定这样做而不会浪费时间生成它第三位。但是return 声明稍有不同,是的,我的代码显然等同于d3() + 3 * toss()
【解决方案2】:

如果你只是想要其他选择,不一定是好的选择,那么这个怎么样:

  1. 为每个可能的输出值掷硬币。
  2. 如果有一个或多个正面,则丢弃所有可能出现反面的值。
  3. 如果您只剩下一个值,请停止。否则转到 1。

我怀疑它的预期抛硬币次数会比你描述的方法高,而且真的没有任何优势。

一般来说,我认为这就是为什么没有太多使用随机数的其他可能方式的原因。他们只是没有那么好。

【讨论】:

    【解决方案3】:
    1. 翻转 5 个硬币。如果都是正面或反面,你的答案是 1。如果只有一个正面或一个反面,继续下一步。如果有不止一个头和不止一个尾,请重复此步骤(包括重新翻转硬币)。

    2. 翻转 4 个硬币。如果都是正面或反面,你的答案是 2。如果只有一个正面或一个反面,继续下一步。如果有两个正面和两个反面,重复此步骤(包括重新翻转硬币)。

    3. 翻转 3 个硬币。如果都是正面或反面,你的答案是3。否则,继续下一步

    4. 翻转 2 个硬币。如果他们都是正面,你的答案是 4。如果他们都是反面,重复这个步骤(包括重新翻转硬币)。否则,继续下一步。

    5. 翻转 1 个硬币。如果是正面,你的答案是 5。如果是反面,你的答案是 6。

    【讨论】:

    • 这为提问者提供了他们应得的要求替代答案。它比我们应该避免的答案效率低,并且更难证明正确。优秀:-)
    • 不过,请稍等。我看到如果我们到达第 3 步,得到答案 3 的条件概率是 1/4,这是正确的。但是如果我们到达第 4 步,得到答案 4 的条件概率是 1/2,有 1/2 的机会进入第 5 步。这似乎是错误的,不应该是答案 4、2 的 1/3 机会/3 继续?也就是说,应该有 1/4 的机会重复第 4 步。
    • @Steve:你是对的。我算错了。我进入了我的模式并错过了我必须为 1 2 1 案例更改它。现在已经修好了。
    猜你喜欢
    • 2019-01-09
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多