- /**
- * 全概率计算
- *
- * @param array $p array('a'=>0.5,'b'=>0.2,'c'=>0.4)
- * @return string 返回上面数组的key
- */
- function random($ps){
- static $arr = array();
- $key = md5(serialize($ps));
- if (!isset($arr[$key])) {
- $max = array_sum($ps);
- foreach ($ps as $k=>$v) {
- $v = $v / $max * 10000;
- for ($i=0; $i<$v; $i++) $arr[$key][] = $k;
- }
- }
- return $arr[$key][mt_rand(0,count($arr[$key])-1)];
- }
例2,php抽奖程序 算法二
- 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;
- }
上述代码是一段经典的概率算法,$proArr是一个预先设置的数组,假设数组为:array(100,200,300,400),开始是从1,1000这个概率范围内筛选第一个数是否在他的出现概率范围之内, 如果不在,则将概率空减,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。这样筛选到最终,总会有一个数满足要求。就相当于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个一定是。
这个算法简单,而且效率非常高,关键是这个算法已在以前的项目中有应用,尤其是大数据量的项目中效率非常棒。
|