37定律的分析和模拟(随机数组的生成算法)
来源:互联网 发布:it行业 知乎 编辑:程序博客网 时间:2024/04/30 17:17
所谓三七定律,是指在n个候选中,你对于每一个候选只能选择或者放弃,不能回头反悔。那么抛弃前37%个,对于后63%个候选:选则第一个比前%37个候选好的。
证明:假设抛弃前k个候选,那么选到最好的概率记作P(k)
要求k使得P(k)最大:P(k) =∑ni=k+1 P(第i个是最好的 )P(前i-1个最好的在前k个中)
P(k)=∑i=k+1n1n∗ki−1
根据∑ni=11i−>ln(i)
P(k)=knln(nk)=−xln(x)......x=kn
求导解得x=e−1= 37% −>P(k)=37 %
模拟程序:
def simu(array): import math e = math.e n = len(array) k = int(n/e) max1 = max(array) max2 = max(array[:k+1]) for i in range(k+1,n): if array[i]>max2: if array[i]==max1:return True else:return False return Falsedef proc(): import random best = 0 n=5000 array = list(range(10000)) for j in range(n): for i in range(1000): a,b = random.randint(0,9999),random.randint(0,9999) array[a],array[b]=array[b],array[a] if simu(array):best+=1 print(best/n)proc()
经过几次模拟,程序的答案在0.35-0.38之间,不能很好收敛,这可能是因为我的随机生成的矩阵概率分布不是完全均匀分布的,因此我修改了我的随机数组生成的算法:该算法一共有n!种可能的结果,与数组的排列总数相同,因此从理论上来讲更好的满足了随机的性质
array = list(range(1000)) for j in range(n): for i in range(1000): b = random.randint(i,999) array[i],array[b]=array[b],array[i]
这样得到的结果基本稳定在37%左右
0 0
- 37定律的分析和模拟(随机数组的生成算法)
- 随机算法和概率分析的区别
- 随机森林和GBDT算法的分析
- 算法--生成随机数组
- 随机数组生成算法
- 生成数组的随机排列
- 动态生成数组,随机生成一定范围的随机数,三种常用排序算法
- 生成一个不重复的随机数组
- 生成随机数组的两种方式
- 返回n个随机生成的数组
- 通过随机函数生成一个随机的数组
- 八皇后问题和八数码问题的最陡上升爬山法、首选爬山法、随机重启爬山法、模拟退火算法的分析和实现
- 使用二分查找算法在数组查找随机生成的key对应的值
- 随机排列生成算法的一些随想
- 随机排列生成算法的一些随想
- 随机排列生成算法的一些随想
- 机器学习算法的随机数据生成
- 不重复随机数列的生成算法
- (0001) iOS 开发之收集第三方资源篇
- AngularJS Scope(作用域)
- MPRemoteCommandCenter
- 1032. 挖掘机技术哪家强(20)-PAT乙级真题
- hashCode() 和equals() 区别和作用
- 37定律的分析和模拟(随机数组的生成算法)
- 杭电-1009 FatMouse' Trade
- android应用去掉标题栏的方法
- IOS Cookie使用
- leetcode 367. Valid Perfect Square
- 关于oracle客户端不能使用的解决办法
- Java WebService 简单实例
- 1031. 查验身份证(15)-PAT乙级真题
- 广播——使用广播接收者接收短信