其实发这篇博感觉并没有什么用,太简单了,会的人不屑看,不会的人自已动动脑子也想到了。但是看着自已的博客已经这么久没更,真心疼~。粗略算下一篇只有代码的水文,会占用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;  }            
新闻热点
疑难解答