如何选择走过你生命中的100个女孩

1.    现状

        有一个有意思的问题,假如一个男性,TOM,一生中会遇到100个女孩儿,当他遇到某个女孩儿的时候必须立即决定是否要和她永结同心,那么TOM该如何选择人生中的最佳伴侣呢?

2.    37%解决方案

        笔者看过有一篇文章从数学的角度,从选择到最好的女孩的角度分析了这个问题。下面是这篇文章所讲述的

       为了便于我们分析,让我们把生活中各种复杂纠纷的恋爱故事抽象成一个简单的数学过程。假设根据过去的经验,这个男性,TOM,可以确定出今后将会遇到的mm个数,比如说 15 个、30 个或者 50 个。不妨把女生的总人数设为 n。这 nmm将会以一个随机的顺序排着队依次前来表白。每次被表白后,TOM都只有两种选择:接受这个mm,结束这场征婚游戏,和她永远幸福地生活在一起;或者拒绝这个mm,继续考虑下一个表白者。我们不考虑TOM脚踏两只船的情况,也不考虑和被拒mm破镜重圆的可能。最后,mm有高质量有低质量,我们不妨假设TOM心里会给mm们的优劣排出个名次来。

        聪明的TOM会想到一个好办法:先和前面几个mm玩玩,试试水深;大致摸清了mm们的底细后,再开始认真考虑,和第一个比之前所有人都要好的mm发展关系。从数学模型上说,就是先拒掉前面 k mm,不管这些mm有多好;然后从第 k+1mm开始,一旦看到比之前所有人都要好的mm,就毫不犹豫地选择她。不难看出,k的取值很讲究,太小了达不到试的效果,太大了又会导致真正可选的余地不多了。这就变成了一个纯数学问题:在mm总数 n已知的情况下,当 k等于何值时,按上述策略选中最佳mm的概率最大?

对于某个固定的 k,如果最适合的mm出现在了第 i个位置(k < i ≤ n),要想让mm有幸正好被 TOM选中,就必须得满足前 i-1个人中的最好的人在前 k个人里,这有 k/(i-1)的可能。考虑所有可能的 i,我们便得到了试探前 k个mm之后能选中最佳mm的总概率P(k)


 x 来表示 k/n 的值,并且假设 n充分大,则上述公式可以写成:


 -x · ln x求导,并令这个导数为 0,可以解出 x的最优值,它就是欧拉研究的神秘常数的倒数—— 1/e

也就是说,如果你预计求爱者有 n个人,你应该先拒绝掉前 n/e个人,静候下一个比这些人都好的人。假设你一共会遇到大概 30个求爱者,就应该拒绝掉前 30/e ≈ 30/2.718 ≈ 11个求爱者,然后从第 12个求爱者开始,一旦发现比前面 11个求爱者都好的人,就果断接受他。由于 1/e大约等于 37%,因此这条爱情大法也叫做 37%法则。

此方案参考了http://songshuhui.net/archives/57722

3.    37%的不合理之处

        但是,37%法则有一个小问题:如果最佳人选本来就在这 37%的人里面,错过这37%的人之后,TOM就再也碰不上更好的了。但在游戏过程中,TOM并不知道最佳人选已经被拒,因此TOM会一直痴痴地等待。也就是说,TOM将会有 37%的概率失败退场,或者以被迫选择最后一名求爱者的结局而告终。从我们的人生角度考虑的话,这样的风险是不是就太大了???而且我们仔细看看这样的计算的条件,我们算出的37%假设的隐含前提是,我们只对最好的那个mm有兴趣,对其他的mm没有任何兴趣。而现实中,很多人只要能得到一个中上的mm就心满意足了,同时他们很害怕一辈子都找不到妹子(最好的mm如果在37%中,TOM就会一辈子找不到老婆了。。。)。所以,这个问题更现实的版本是,怎样让TOM找到尽可能好的mm?(而不是有最大的概率,找到最好的那个妹子)。

4.    更好的的解决方案

        所以我们现在就变成了要让TOM找到mm的质量的权值最大。于是在此,我们假设100个女孩儿的质量已经有标明,从1-100(只是TOM不知道)。我们可以同样设之前作为比较对象的是,前k个女孩儿。在我们现在的问题中,大家可以预想这样的情况,如果质量为100mm出现在了前K个里边,可怜的TOM就只能孤老一生了,所以这样的情况下的权值为零。Tom孤老终生的概率为,K/100Tom老婆的质量高于99的概率(就是质量99的出现在k里而100的没有出现在k里)是:(100-k/100 * k/99Tom老婆的质量为98的概率是:(100-k/100 * 99-k/99 * k/98。最倒霉的情况就是命中质量为K+1mm了,这样的情况只有之前遇到的kmm的质量正好是1k时才会发生。这个的概率就是,质量排在前面99-k个的mm都不中的概率,乘以剩下最差的的k个中命中质量为1mm的概率:(100-k/100 * 99-k/99 *98-k/98 *……(102-2k)/(102-k) * 1/(k+1)。于是我们可以列出表达式,TOM找到的老婆的质量的权值为:

        k/100 * 0 + (100-k)/100 * k/99 * 100 +100-k/100 *100-k/99 * k/98 * 99 +…………

5.    程序模拟

        好了,我们有了数学算式,理论上完全能知道怎么帮助无奈的桃花运超好的TOM同学了。只需要求和,求导,就行了。但是这个式子实在难以计算,所以笔者采取了用程序模拟的方法,让计算机帮我们算出结果。

        我还是假设100个女孩儿的质量从1100,申明一个大小为k的数组保存之前的kmm的质量情况。我们用随机数往里边不重复地填1-100的数字就行了。然后我们就能知道这前k个女孩儿的最好的一个的质量是多少。假设这个最好的女孩儿质量为q,则q越大肯定TOM实际选择到的老婆的质量也越高,所以我们只需要看我们选择到的k个女孩儿中最好的质量为多少,即可作为TOM老婆的质量的等价标准。

6.    简陋的代码

        我在程序中做了一百万次实验取平均值,让结果相当精确。代码不怎么样,不过确实能达到目的,不喜勿喷(*^__^*)

public class BestGirl {

 public static void main(String[] args) {

          int num = 20;//玩过的女孩数量,就是上面的k

      int life = 1000000;//模拟TOM一百万个一辈子的情况

      int total = 5;

      for(int j = 1;j < total;j++){

            double ave = 0;

            num = j;

          for(int i = 0;i < life;i++){

              int[] girl = find(num,total);

              ave = ave + max(girl)%total;

          }

          System.out.println(j+"  "+ave/life);

      }

 }

 public static int[] find(int num,int total){

      int[] girl = new int[num];//记录玩过的女孩的质量

      for(int i = 0;i < num;i++){

            int temp = (int)(Math.random()*total);

            int judge = 0;//判断模拟生成的女孩质量指数是否重复

            for(int j = 0;j < i;j++){

                 if(temp == girl[j]){i--;judge = 1;}//模拟生成的女孩质量指数已经存在过了,重新生成

            }

            if(judge == 0)girl[i] = temp;

      }

      return girl;

 }

 public static int max(int[] girl){

      int max = 0;

      for(int i = 0;i < girl.length;i++){

            if(girl[i] > max)max = girl[i];

      return max+1;

 }

}

7.    结果

        实验的结果表明,如果TOM一生中会和100mm擦肩而过的话,那只需要把前9mm作为样本就行了!!!!!

下面是k1-50时的权值:

1  49.463756          2  65.321506          3  72.745243             4  76.795228

5  79.187116          6  80.569507          7  81.379381            8  81.791246

9  81.912999          10  81.855833       11  81.60609           12  81.228624

13  80.825338        14  80.282171        15  79.748856         16  79.074186

17  78.395126        18  77.682471        19  76.886801         20  76.252873

21  75.512409        22  74.583178        23  73.800195          24  72.956599

25  72.122719        26  71.25072          27  70.393686          28  69.543246

29  68.594598        30  67.757399        31  66.836978          32  65.984432

33  65.09203          34  64.180472        35  63.264061          36  62.313682

37  61.279555       38  60.482462         39  59.48373            40  58.512363

41  57.550438       42  56.729568         43  55.903816           44  54.681889

45  53.83102         46  52.900635          47  51.926824          48  51.005697           

49  49.961179       50  49.024802

 

8.    更接近我们的人生

        实际上很多人一辈子不可能遇到100个可能结为连理的mm,这个数字大多数人都是个位数。所以我们把实验数据调整一下,看看当TOM一辈子只有10mm的时候的情况。

        1000000次的数据表明,TOM在一生只和10mm有可能结为夫妻的情况下,需要把前2mm作为参考标准,能让TOM有尽可能的风险的同时得到最美丽贴心的夫人。不过让人惊异的是,当TOM一生的邂逅mm数缩减到5个的时候,实验证明他还是需要把前2mm作为标准。。。所以这个数据并不是100个就选10个,10个就选一个这样等比例增减的。

9.    回到现实的世界

        在真实的世界中,我们还可以有更多的方式来优化上面的9/100,2/10,2/5算法,比如用统计学的分布来检验我们得到的前k个女孩的质量。因为前k个女孩的质量分布也能影响我们的决策,比如前k个女孩的质量分布相当均衡的情况和前k个女孩中有一个女孩儿的质量异常高的情况下,我们在后面的决策是不一样的。比如在后者的情况下,我们在k个之后的女孩中即使遇到了接近但是小于那个异常高质量的女孩的数值的mm时,也完全可以考虑。或者,当我们本来打算前k个都观望的,但是其中某一个女孩异常优秀,远好于k个中其他的,我们也可以考虑直接上了。

        另外,在现实的选择中,我们还需要注意的是,当100个女孩儿选了80个了还没有高于前k个的时候,我们应该把我们的标准放低,以减小零收益的风险。所以我们可以预测到一种更好的选择女孩儿的算法,可以把100分成,比如五个阶段,0-20,21-4041-60,61-80,81-100,不同阶段,根据当前阶段的所有数据采取不同的策略能够更好地选择到更优秀的女孩儿。

10. 尾声

        广大男同胞们,2/52/10这样的数据确实能指导我们的人生,但是笔者提醒大家,数字毕竟只能指引我们,但不能主导我们。我们都是有血有肉有思想有情感的爷们儿,而不是机器人。智商足够高的终结者会完全按照他的算法来选取配偶(如果他需要的话(*^__^*))而我们的生活要由我们自己掌控,对象的选择不能光顾质量和自己一时爽,还要照顾对方的情感,负起责任,并且良好的感情是用时间的耐心慢慢磨合慢慢培养出来的。

        笔者觉得,内外皆佳最好的mm不是天生的,而是由我们培养的。珍惜现在,投入感情,互相理解包容才是恋爱,婚姻的实质。最后祝广大男程序员同胞们都能有情人终成眷属,都能抱得美人归!!!


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值