编什么程PHP开发

利用最优停止理论,寻找你的真爱

2019-01-06  本文已影响59人  沙蒿同学

前言

某天我在西瓜视频看了李永乐老师的《如何才能找到真命天子?》,感触颇多,心想能不能用编程把这个数学公式给敲出来,好啦,说干就干。建议各位同学朋友有空多看看李永乐老师的教学视频,纯干货,老师讲得好还很有趣。

开始

故事要从苏格拉底他老人家开始说起:
一天,苏格拉底带领几个弟子来到一块长满麦穗的田地边,对弟子们说:“你们去麦地里摘一个最大的麦穗,只许进,不许退。”
第一个弟子走几步看见一支又大又漂亮的麦穗,高兴地摘下了。但是他继续前进时,发现前面有许多比他摘的那支大,只得遗憾地走完了全程。第二个弟子吸取了教训.每当他要摘时,总是提醒自己,后面还有更好的。当他快到终点时才发现,机会全错过了。第三个弟子吸取了前两位教训.当他走到三分之一时,即分出大、中、小三类,再走三分之一时验证是否正确,等到最后三分之一时,他选择了属于大类中的一支美丽的麦穗。虽说,这不一定是最大最美的那一支,但他满意地走完了全程。"
苏格拉底观点:“麦地里肯定有最大的麦穗,但你未必能碰到它。即使碰到了,也未必能作出准确的判断。只有你在经历过一半以后选择你认为最好的,以后也许会遇到比你选择的更好的,但你会一生无悔”

我的看法

是啊,类似捡麦穗,人的一生都希望可以寻找到一个真正爱你的人,尽管你知道他不会是完美的,但你一定希望他在你心里就是完美的那一个。也许,你的一生会遇到很多爱你的人,但最终你们别没有走到一起;也许你的一生一心一意只爱一个人,而那个人却一直没出现;有句话说得好,人的一生会遇到三种女人,第一种是你爱的人却不爱你的人,第二种是爱你的人你却不爱的人,第三种是你不爱她不爱却可以相伴一生的人,那么问题来了,你现在喜欢的是那种人呢?为什么前任要跟我分手呢?什么时候才是我选择真爱的时候呢?别急,看下面哈。

代码实现

<?php
/**
* Created by PhpStorm.
* User: benny
* Date: 18-12-7
* Time: 下午2:58
*/
$first_time = microtime(true);
//var_dump(find_love(8,1))."<br/>";

$result = [];
for ($i=1;$i <= 8;$i++){
  $percent = array();
  //生成排列组合可能性数组
  //例如:恋爱3次,有6种可能, "[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]"
  $all_array = arrangement(range(1,$i),$i);
 // var_dump(json_encode($all_array));
  echo "<br/>";
  for ($j=0;$j<$i;$j++){
      $percent[] = find_love($i,$j,$all_array);
  }
  $smaple = array_search(max($percent),$percent);
  echo '当你恋爱次数为:'.$i.' 时,你应该选择的样本数为:'.$smaple.' , 你得到真爱的概率是:'.max($percent)."<br/>";

  switch ($i) {
      case 1:
          echo "当你选择一生只挚爱一个人的时候,那毋容置疑你选择的她,那是你一生中最‘完美的人’,可能在他人眼里他有很多的瑕疵,但在你心里永远的值得依靠的另一半。<br/>";
          break;
      case 2:
          echo "你的一生会被两个人所疼爱,不管你选择的前者还后者,你得到真爱的概率只有50%,就如鱼和熊掌不可兼得,得与失之间选择,选择前者你可能会对未知的那个他报有期望,选择后者的你可能会念念不忘与前任的朝朝夕夕。<br/>";
          break;
      case 3:
          echo "如果你选择相爱3次,你应该把第一个遇到的那个人当做样本,不管他好不好,你最后都不要跟他在一起,这可能就是为什么我有些人会失恋的原因吧,因为你落入到他人的样本区间啦。<br/>";
          break;
      case 4:
          echo "人的一生是短暂的,你能相爱四次,证明你也是有一定魅力的,也相当自信,选择相爱四次的你是最机智的,总和考虑,这个选择可以让你最大概率的得到真爱,选择第一个作为自己的样本得到真爱的概率是46%。<br/>";
          break;    
      default:
         echo "不解释,你都是老司机啦,希望你找到真爱。<br/>";
          break;
  }
  // $result[]= $item =[
  //     'love_nums' =>  $i,
  //     'sample_nums' => $smaple,
  //     'percent'   =>  max($percent),
  // ];

}
//var_dump(json_encode($result));
$last_time = microtime(true);

echo '运行时间:'.round($last_time-$first_time,8).'秒';

/*
  $love_nums 恋爱次数
  $sample_nums 样本个数
  $all_array 所有恋爱可能性排列情况
*/
function find_love($love_nums = 0,$sample_nums = 0,$all_array = array()){
  $sum = count($all_array);
  
  $count = 0;
  
  foreach ($all_array as $item){

      if ($sample_nums == 0 && $item[0] == $love_nums) {
         $count++;
      }
      else{
          $sample_array = array_slice($item,0,$sample_nums);
          $love_array = array_slice($item,$sample_nums);
          foreach ($love_array as $key => $value) {
              if ($value > max($sample_array) && $value == $love_nums) {
                  $count++;
                  break;
              }elseif($value > max($sample_array) && $value != $love_nums){
                  break;
              }
          }
         
      }
      
      

  }
  return sprintf('%.2f',$count/$sum);
}

// 阶乘
function factorial($n) {
  return array_product(range(1, $n));
}

// 排列数,公式=n!/(n-m)!
function arrange_num($n, $m) {
  return factorial($n)/factorial($n-$m);
}

// 组合数,公式=(n!/(n-m)!)/m!
function combination_num($n, $m) {
  return arrange($n, $m)/factorial($m);
}
// 排列
function arrangement($st_array, $m) {
  $re_array = array();

  $n = count($st_array);
  if ($m <= 0 || $m > $n) {
      return $re_array;
  }

  for ($i=0; $i<$n; $i++) {
      $item_array = $st_array;
      $t = array_splice($item_array, $i, 1);
      if ($m == 1) {
          $re_array[] = $t;
      } else {
          $c = arrangement($item_array, $m-1);
          foreach ($c as $v) {
              $re_array[] = array_merge($t, $v);
          }
      }
  }

  return $re_array;
}

// 组合
function combination($st_array, $m) {
  $re_array = array();

  $n = count($st_array);
  if ($m <= 0 || $m > $n) {
      return $re_array;
  }

  for ($i=0; $i<$n; $i++) {
      $t = array($st_array[$i]);
      if ($m == 1) {
          $re_array[] = $t;
      } else {
          $item_array = array_slice($st_array, $i+1);
          $c = combination($item_array, $m-1);
          foreach ($c as $v) {
              $re_array[] = array_merge($t, $v);
          }
      }
  }

  return $re_array;
}

效果图

image.png

总结

话题

看完故事、代码和结论,你应该知道下一个她是不是你的真爱了吧?可下方留言哦。

原文作者:------ 沙蒿 ------
关注我吧《程序员的碎碎念》作者,不会ui的前端不是好后端
不忘初心,牢记使命,对于文章内容有疑问的或者想深入交流学习的朋友可以加我QQ:2283743369

上一篇下一篇

猜你喜欢

热点阅读