37%法则

苏格拉底的问题:

在一片麦田里摘出一颗最大最好的麦穗。但只能摘一次,而且不能回头。

传说这是苏格拉底给他的弟子柏拉图提出的问题,又传说柏拉图进行了2次选择:

1.柏拉图第一次走进麦田,他发现很多很好的麦穗,他摘下了他看到的第一个比较大的麦穗,然后继续往前走,却沮丧地发现自己越走越失望,前面还有不少更好的,但是他却不能再摘了。

2.柏拉图第二次走进麦田,他依然发现很多很好的麦穗,但是这一次他吸取教训——前面一定有更好的。他一直向前走,直到发现自己差不多走出了麦田。按照规则,他回不去了,而他刚刚错过了最好的麦穗。

那怎么做才能拿到最大最好的问题呢?

分析:

转化为数学问题:

已知在一个无序的集合 N 中(集合大小已知),一次只能查看一个数,查看后选择是否取出这个数,在只能取一次的情况下,怎么取到集合 N 中的最大数?

猜想:

对于这个集合,要取出最大的数, "最大"肯定是比较出来的,既然是比较,必须要有比较的对象,所以我们把集合 N 拆分为2个子集A和B,集合A用来观察和比较,

集合B用来抽取 “最大” 的数。

那么,该怎么拆分集合N呢?

想到了2种方法:

1.根据 大数定理 ,多次模拟在集合中取数,比较 取出的数 等于 集合中最大数频率,以频率估算概率。

2.遍历所有的情况,根据 全概率公式 ,进行数学计算。

解法1:

假设集合N大小为100,生成长度为100的随机数组,求出前 k 个数中的最大值 max_base,

从 k+1 开始,如果这个数大于 max_base,则取出这个数作为结果,

如果第 k+1 个数到最后都小于max_base,则取出最后一个数作为结果。

重复抽取 100000 次,以频率估算概率,

k的值为1-100,代码如下:

1 #Author:shijt

2 importrandom3 importtime4

5 #获取数组中前 number 个数中的最大数

6 defgetMaxBase(number,random_list):7 returnmax(random_list[:number])8

9 defgetMaxGuess(number,random_list):10 max_guess=getMaxBase(number,random_list)11 for i in range(number,100):12 if (random_list[i] >= max_guess or i==99):13 max_guess =random_list[i]14 break

15

16 returnmax_guess17 18 for j in range(1,100):19 count =020 for i in range(100000):21 random_list =[]22 #生成长度为100的随机数组

23 for i in range(100):24 random_list.append(random.randint(1, 10000))25 if (getMaxGuess(j, random_list) == getMaxBase(100, random_list)):26 count += 1

27 print(j,count, count / 100000)

以上代码重复执行了3次,得到结果

出现了3种不同的结果,分别是当k =37,39,36时,取出最大数的频率较高,都 约等于 0.373

由此猜测,当选择 37%-38%的数作为参考时,取得最大数的概率较高,约为0.373

解法2:

假设取 k 个数作为观察集合,则对于某个固定的k,第 i 个数为最大数,由全概率公式:

当n充分大时,

其中,x=k/n, p(k)=1,

所以,-xlnx=1,解得x=1/e,即 k/n=1/e,   e为自然对数的底

1/e约等于 0.3679,约等于37%

解后分析:

我们可以看到,解法1和解法2的结果虽然比较接近,但还是有些差别,我认为造成这个差别的原因有2个:

1.在解法二中,要求集合N足够大,而解法1中的n为 100 ,显然不能满足足够大的条件,但是由于本人计算机能力有限,仅能以此作为粗略计算;

2.当k为 35-39时,彼此之间的概率相差极小,而大数定理本身也是一种估算方法,误差难以避免。

总的来说,对于苏格拉底的问题,显然最好的方法就是 先观察前37% 的麦穗,然后再遇到比前面麦穗更大的麦穗时,就摘下,否则,则摘取最后一颗麦穗。

37%法则的拓展

有人以以上数学模型来解决 恋爱问题 ,我觉得不妥,原因有3:

1.我们不必总是找到最好的那个作为伴侣,可以接受一个相对较好的;

2.我们不能接受很差的人作为伴侣,(当只剩下一个人时,我们就没得选);

3.我们最终是为了找到伴侣,找到比找到最好的更为重要。

问题:

已知在一个无序的集合 N 中(集合大小已知),一次只能查看一个数,查看后选择是否取出这个数,在只能取一次的情况下,怎么取到集合 N 中的较大数?

假设我们不必取到最大的数,而是以最大数的90%作为基准,大于90%则为符合需求的数,那么取得较大数的概率为多少?

分析:

我们和上面解法1一样,用大量的模拟实验来计算频率,并用频率估算概率。

解法:

1 #Author:shijt

2 importrandom3 importtime4

5 random_list =[]6 for i in range(100):7 random_list.append(random.randint(1, 10000))8

9 defgetMaxBase(number, random_list):10 return max(random_list[:number])*0.9

11

12 defgetMaxGuess(number, random_list):13 max_guess =getMaxBase(number, random_list)14 for i in range(number,100):15 if (random_list[i] >= max_guess or i == 99):16 max_guess =random_list[i]17 break

18 returnmax_guess19

20 for j in range(1,100):21 count =022 for i in range(10000):23 random_list =[]24 for i in range(100):25 random_list.append(random.randint(1, 10000))26 if (getMaxGuess(j, random_list) >= getMaxBase(100, random_list)):27 count += 1

28 print(j,count, count / 10000)

结果:

当选择63-65%的数作为参考时,可以得到 较大数 的概率较高,约等于95.7%,可以说远远高于 37%了,这才比较适合作为 恋爱问题的解法。

PS:当你愿意降低要求到85%时,你会发现,找到伴侣的概率约为 99%,还怕 找不到对象 吗?

以上仅能作为参考,毕竟人心比数学复杂的多

python找不到对象怎么办_[python,2018-06-29] 37%法则及其拓展解决恋爱问题相关推荐

  1. [python,2018-06-29] 37%法则及其拓展解决恋爱问题

    [python,2018-06-29] 37%法则及其拓展解决恋爱问题 参考文章: (1)[python,2018-06-29] 37%法则及其拓展解决恋爱问题 (2)https://www.cnbl ...

  2. python找不到对象怎么办_你为什么总找不到对象

    不知道某个时间点,你是否会对着美颜相机中的自己顾影自怜,这么帅,这么有才华,为何还找不着对象呢?这个不是我能解决的问题.今天我们要给大家解决的技术问题是"Object not found&q ...

  3. python找工作不好找怎么办_为何Python不好找工作?

    导语:随着人工智能的大火,越来越多的人选择去学习Python编程语言,但是总会在网上看到有人吐槽学完Python找不到工作.为什么会出现这种情况呢?和优就业小编一起来了解一下吧. 为什么会出现这种学习 ...

  4. python找不到对象怎么办_R中找不到对象怎么回事

    > R > library(parallel) > library(rugarch) > library(zoo) > library(xts) > RR > ...

  5. python内存回收垃圾有哪些_[Python之路] 内存管理垃圾回收

    一.python源码 1.准备源码 解压得到文件夹: 我们主要关注Include中的".h"文件以及Objects目录中的".c"文件. 我们从Include和 ...

  6. python中for循环的用法_@Python小白,一文让你掌握Python爬虫

    兴趣 我没事喜欢逛知乎,有一段时间看到了这个问题:利用爬虫技术能做到哪些很酷很有趣很有用的事情: http://t.cn/RptGOPx 觉得回答的一个个炒鸡酷炫 就对爬虫产生了浓厚的兴趣, 于是就开 ...

  7. 只学python找工作难吗-只学python语言找工作难吗?

    只学python语言找工作难吗?小编可以肯定的告诉你不难, 初级中级高级职位都有啊,学习python可以找后台开发.数据挖掘.机器学习等方面的工作,python的强大之处在于拥有许多第三方包,可以说是 ...

  8. 为何python不好找工作-谁说Python找工作难?人生苦短,Python工程师你们还好吗?...

    前几天看到某网站看到有人提了这么个问题,Python这么火,为啥找工作这么难呢? 近几年人工智能的发展确实推动了Python的热度,Python出现在了中小学课本,产品经理.运营等非程序员职业都认识到 ...

  9. python c++情侣网名含义_#python和C/C++#让python和C/C++联姻

    让python不在孤单,轻易而举的为python写C/C++第三方库. 我们都知道python很慢,特别是处理大数据的时候,简直慢到极致,如果在知道代码的瓶颈的时候,可以将需要大量计算的数据块放在C/ ...

最新文章

  1. HANA 数据库备份hang住的解决办法
  2. N-LTP:基于预训练模型的中文自然语言处理平台
  3. 应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序
  4. Python中threading的join和setDaemon的区别及用法
  5. Java实现文件过滤
  6. Taro+react开发(97):问答模块04
  7. 阿里影业授出1672.5万份购股权
  8. windows 2012 r2 can't find kb2919355
  9. 普通的测试员和牛逼的测试员有什么区别?完成这两次跨越,你也可以
  10. UL -758_2022电器布线电线电缆安全标准,刚刚发行最新版
  11. 添加logviewer用户
  12. windows 打补丁转载)
  13. Criterion和Criteria
  14. AMD define函数
  15. 【PTA】【Python】【拼题A 2022 跨年挑战赛】太神奇了
  16. css 画一条水平直线和垂直竖线
  17. 字符串分隔 【问题描述】 输入两个字符串str和cut。cut由若干个字符构成,其中每个字符均可作为一个分隔字符对str进行分隔。
  18. 求旋转体体积表面积时的dx,ds问题的简单解释
  19. wordcloud的常用函数
  20. Java实现AD域登录认证

热门文章

  1. 【多目标优化求解】基于matlab飞蛾扑火算法 (NSMFO)求解多目标优化问题 【含Matlab源码 2312期】
  2. (五)flask扩展
  3. mac git 切换分支文件仅读
  4. net与树莓派的情缘(一)
  5. macfee怎么生成释放代码_mcafee状态代码含义列表以供查询
  6. Oracle获取一周前,一个月前,一年前的日期,一个月的总天数、一个月的全部日期
  7. mac安全隐私中没有任何来源
  8. Word2003模板损坏
  9. 中文定制linux,强烈推荐新氧ubuntu中文定制版
  10. node Sream