首页 > 开发 > PHP > 正文

PHP概率计算函数汇总

2024-05-04 22:35:00
字体:
来源:转载
供稿:网友

其实发这篇博感觉并没有什么用,太简单了,会的人不屑看,不会的人自已动动脑子也想到了。但是看着自已的博客已经这么久没更,真心疼~。粗略算下一篇只有代码的水文,会占用OSC至少十几KB的数据库空间呢,但是,一想到乱弹里的然并卵,也就释然了。

<?php /** * 概率计算类 * 可用于抽奖等 */class Probability{  /**   * 概率统计数据   * thing => chance   */  var $data = array();  var $chance_count = 0;   function __construct($initdata = array()){    if(!empty($initdata)){      $this->data = $initdata;      foreach($initdata as $d){        $this->chance_count += $d['num'];      }    }  }   function addData($name, $chance){    $this->data[]=array('name'=>$name, 'num'=>$chance);    $this->chance_count += $chance;  }   function getOne(){    $index = rand(0, $this->chance_count);    foreach($this->data as $d){      $index = $index-$d['num'];      if($index<=0){        return $d['name'];      }    }    return '';  }}  /** * 使用示例 */$pro=new Probability();$pro->addData('iphone',10);$pro->addData('watch',30);$pro->addData('$18',50);$pro->addData('thank you',10);$pro->addData('super big',1);for($i=0;$i<100;$i++){  echo $pro->getOne()."/n";}

这是一个很经典的概率算法函数:

function get_rand($proArr) {   $result = '';   //概率数组的总概率精度   $proSum = array_sum($proArr);   //概率数组循环   foreach ($proArr as $key => $proCur) {     $randNum = mt_rand(1, $proSum);       //抽取随机数    if ($randNum <= $proCur) {       $result = $key;             //得出结果      break;     } else {       $proSum -= $proCur;               }   }   unset ($proArr);   return $result; }

假设:我们有这样一个数组:a奖概率20%,b奖概率30%,c奖概率50%

$prize_arr =array('a'=>20,'b'=>30,'c'=>50);

模拟函数执行过程:

总概率精度为20+30+50=100

第一次数组循环,$procur=20

假设抽取的随机数rand(1,100),假设抽到$randNum=55

if判断-------

如果$randNum<=20,则result=a

否则进入下一循环,总概率精度变为100-20=80

第二次数组循环,$procur=30

假设抽取的随机数rand(1,80),假设抽到$randNum=33

if判断---------

如果$randNum<=30,则result=b

否则进入下一循环,总概率精度变为80-30=50

第三次数组循环,$prosur=50;

假设抽取的随机数rand(1,50),不管怎么抽,随机数都会<或=50,

那么得出result=c;

 因为样本没有改变,虽然可能抽取的随机数不止一个,但是概率是不变的。

或者也可以这样:

  function get_rand($arr)  {    $pro_sum=array_sum($arr);    $rand_num=mt_rand(1,$pro_sum);    $tmp_num=0;    foreach($arr as $k=>$val)    {        if($rand_num<=$val+$tmp_num)      {        $n=$k;        break;      }else      {        $tmp_num+=$val;      }    }    return $n;  }            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表