37定律的分析和模拟(随机数组的生成算法)

来源:互联网 发布:it行业 知乎 编辑:程序博客网 时间:2024/04/30 17:17

所谓三七定律,是指在n个候选中,你对于每一个候选只能选择或者放弃,不能回头反悔。那么抛弃前37%个,对于后63%个候选:选则第一个比前%37个候选好的。

k,P(k)

要求k使得P(k)最大:P(k) =ni=k+1P(第i个是最好的 )P(前i-1个最好的在前k个中)

P(k)=i=k+1n1nki1

ni=11i>ln(i)

P(k)=knln(nk)=xln(x)......x=kn

求导解得x=e1= 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