[python,2018-06-29] 37%法则及其拓展解决恋爱问题
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,代码如下:
# Author:shijt
import random
import time #获取数组中前 number 个数中的最大数
def getMaxBase(number,random_list):
return max(random_list[:number]) def getMaxGuess(number,random_list):
max_guess=getMaxBase(number,random_list)
for i in range(number,100):
if (random_list[i] >= max_guess or i==99):
max_guess = random_list[i]
break return max_guess
for j in range(1,100):
count = 0
for i in range(100000):
random_list = []
#生成长度为100的随机数组
for i in range(100):
random_list.append(random.randint(1, 10000))
if (getMaxGuess(j, random_list) == getMaxBase(100, random_list)):
count += 1
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一样,用大量的模拟实验来计算频率,并用频率估算概率。
解法:
#Author:shijt
import random
import time random_list = []
for i in range(100):
random_list.append(random.randint(1, 10000)) def getMaxBase(number, random_list):
return max(random_list[:number])*0.9 def getMaxGuess(number, random_list):
max_guess = getMaxBase(number, random_list)
for i in range(number,100):
if (random_list[i] >= max_guess or i == 99):
max_guess = random_list[i]
break
return max_guess for j in range(1,100):
count = 0
for i in range(10000):
random_list = []
for i in range(100):
random_list.append(random.randint(1, 10000))
if (getMaxGuess(j, random_list) >= getMaxBase(100, random_list)):
count += 1
print(j,count, count / 10000)
结果:
当选择63-65%的数作为参考时,可以得到 较大数 的概率较高,约等于95.7%,可以说远远高于 37%了,这才比较适合作为 恋爱问题的解法。
PS:当你愿意降低要求到85%时,你会发现,找到伴侣的概率约为 99%,还怕 找不到对象 吗?
以上仅能作为参考,毕竟人心比数学复杂的多
[python,2018-06-29] 37%法则及其拓展解决恋爱问题的更多相关文章
- 2018.06.29 NOIP模拟 Minimum(最小生成树)
Minimum 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出一幅由 n 个点 m 条边构成的无向带权图. 其中有些点是黑点,另外点是白点. 现在每个白点都要与他距离最近的所有黑 ...
- 2018.06.29 NOIP模拟 1807(简单递推)
1807 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出一个由数字('0'-'9')构成的字符串.我们说一个子序列是好的,如果他的每一位都是 1.8.0.7 ,并且这四个数字按照 ...
- 2018.06.29 洛谷P2890 [USACO07OPEN]便宜的回文(简单dp)
P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome 时空限制 1000ms / 128MB 题目描述 Keeping track of all the cows c ...
- 2018.06.29 NOIP模拟 繁星(前缀和)
繁星 [问题描述] 要过六一了,大川正在绞尽脑汁想送给小伙伴什么礼物呢.突然想起以前拍过一张夜空中的繁星的照片,这张照片已经被处理成黑白的,也就是说,每个像素只可能是两个颜色之一,白或黑.像素(x,y ...
- 2018.06.29 NOIP模拟 旅馆(线段树)
旅馆 [问题描述] OIEROIEROIER 们最近的旅游计划,是到长春净月潭,享受那里的湖光山色,以及明 媚的阳光.你作为整个旅游的策划者和负责人,选择在潭边的一家著名的旅馆住 宿.这个巨大的旅馆一 ...
- 2018.06.29 洛谷P1505 [国家集训队]旅游(树链剖分)
旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有 ...
- 2018.06.29 NOIP模拟 边的处理(分治+dp)
边的处理(side.cpp) [问题描述] 有一个 n 个点的无向图,给出 m 条边,每条边的信息形如<x,y,c,r><x,y,c,r><x,y,c,r>. 给出 ...
- 2018.06.29 NOIP模拟 排列(线段树)
排列(premu.cpp) [题目描述] 对于一个 1 到 n 的排列,逆序数的定义为:排列中第 i 位 ai的逆序数就是 a1-ai-1中比 ai大的数的个数.另外用 pi表示 a1,-,ai的逆序 ...
- 2018.06.29 NOIP模拟 区间(前缀和差量)
区间(interval.cpp) 时限:2000ms 空间限制:512MB [问题描述] 给出一个长度为 n 的序列 a[1]-a[n]. 给出 q 组询问,每组询问形如<x,y>< ...
随机推荐
- 关于java的scanner类
java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 首先使用Scanner类时候需要导包: scanner类的基本语法: Scanner类 ...
- Spring ConditionalOnProperty
Spring Annotation @ConditionalOnProperty spring doc解释 @Conditional: Indicates that a component is on ...
- SVN命令备忘录
批量添加(先添加再上传) svn st | grep '^\?' | tr '^\?' ' ' | sed 's/[ ]*//' | sed 's/[ ]/\\ /g' | xargs svn add ...
- [Python学习笔记] 数字类型及操作
数字类型 整数类型 十进制:1110,-123 二进制:以0B或0b开头 0b110,-0B101 八进制:以0O或0o开头 0o123,-0O567 十六进制:以0X或0x开头 0x555,-0X8 ...
- TemplatePart特性的作用
看wp控件的源代码时发现TemplatePart特性,于是在百度上查了查: http://blog.csdn.net/wushang923/article/details/9224533 Templa ...
- linux子系统ubuntu16.04安装使用xrdp当远程桌面
参考文献:https://icytown.com/windows/windows-subsystem-for-linux-gui-xubuntu/ https://jingyan.baidu.com/ ...
- Django之 静态模板渲染
既可以简单的 django.http.HttpResponse 来把内容显示到网页上,也可以使用渲染模板的方法来显示内容. 说明:代码是基于 Django 1.8,但 Django 1.4 - Dja ...
- 使用xheditor时 cloneRange错误 ext.net
使用ext.net 加 xheditor时,一直报 cloneRange错误. 于是 按照说明但独使用xheditor ,检查无错,正常使用, 因此排除版本问题. <ext:panel ru ...
- Plickers——教师拿手机、学生拿卡片,就可以完成即时全员互动!
全员互动.立刻反馈.无设备添加.无能耗增加,风靡全球教育界,杭州师范大学硕士生导师杨俊锋教授推荐!老师拿手机,学生拿卡片就可以完成! 操作方法: 1.注册:登录www.plicke ...
- refreshContext(context)方法源码探究
该方法目的是刷新应用上下文,是容器启动最主要的方法,其实现是一个模板方法,内容巨大,所以先看模板方法都做了哪些事,然后再细看每个方法的实现机制. refreshContext(context)方法首先 ...