首页 » 技术分享 » 编程破解苏格拉底的心灵鸡汤(一)

编程破解苏格拉底的心灵鸡汤(一)

 

引言

大家应该看过这个故事

有一次,苏格拉底带着几个学生去树林摘苹果,他让每一个学生找一个自己认为最大的苹果,不能选2次,也不能走回头路。

但当学生走出树林时,他们都请求苏格拉底,让自己再选一次,有些人开始时就发现了,但以为还有更大的,却失望了;有些人恰好相反,他们先摘了自己认为最大的果子,后来却发现更好的,所以留下遗憾。。。。。

但苏格拉底却坚决不同意, 他说“孩子们,这就是人生,人生就是一次次无法重复的选择”。

问题

那么如果你是学生,该如何去摘取一个最大的苹果呢?(不能走回头路,只能摘一个)


思路

  • 假设再丛林中一共遇到N个苹果,这些苹果的大小完全随机,我们可以令N = 100
  • 那么,首先需要先放弃M个苹果,并且记录他们打大小。
  • 然后,从第M + 1 个苹果开始,一旦有一个苹果的大小超过了之前所有的苹果,就选这一个,否则就接着走。
  • 如果走到最后都没有看到比之前所有苹果更大的,那就只能被迫选最后一个。
  • 那么,M取多少合适?

          M太小,容易遇到一个不大但是比之前所有苹果更大的

          M太大,很容易被迫选最后一个

  • 借助程序,探究选中最大苹果的概率,被迫选最后一个的概率和M的关系,对于每个M,都做了100万次实验。

黑色表示找到最大苹果的概率; 红线表示被迫选最后一个苹果的概率。

可以看到,当M = 35 - 40之间的时候,找到苹果的概率最大。

  • 不考虑最后一个苹果是最大的情况,如果最大的苹果出现在前M个苹果里,那么肯定会被迫选择最后一个,所以概率与M/100成正比,红线是是直线很好理解。
  • 问题来了,如何能够计算出找到最大苹果的概率以及求出对应的M值。
  • 首先,假设最大的苹果出现在第i个,如果 i = M + 1, 那么当放弃M个苹果后,第M + 1 个显然符合要求。
  • 如果i = M + 2, 那么需要前M + 1个苹果相对最大的,而且不能出现在第M+1个,否则就直接选择第M+1个,游戏失败,这样成功概率为M/M+1
  • 如果i = M + K那么前M + K - 1个苹果里,相对最大的就必须出现在前M个当中,否则就必然会导致错误的结果,这样,成功的概率为M/M + K - 1

   

  •  e=2.718100/e =36.8, 而在实验里,最大值也是出现在舍弃37个苹果的,可以说实验和物理吻合。这也可以被称为37% 法则。
  • l所以,如果你是苏格拉底的学生,进入树林,前面的苹果都不要选,但记住大小,到1/3多一点的地方,选择比之前的遇到的苹果都要大的即可。

转载自原文链接, 如需删除请联系管理员。

原文链接:编程破解苏格拉底的心灵鸡汤(一),转载请注明来源!

0