随机、概率、平方差、平均值、正态分布的累计 list=$list;$this-mu=$this-getMu($list);//活取平均值$this-sigma=$this-getSima($list);}/** * @name 正态分布的累计概率函数 * @param string|integer $value * @return
list=$list; $this->mu=$this->getMu($list);//活取平均值 $this->sigma=$this->getSima($list); } /** * @name 正态分布的累计概率函数 * @param string|integer $value * @return number */ public function getCdf($value){ $mu = $this->mu; $sigma = $this->sigma; $t = $value-$mu; @$y =0.5*$this->erfcc(-$t/($sigma*sqrt(2.0))); if($y>1.0) $y=1.0; return $y; } public function erfcc($x){ $z =abs($x); $t =1./(1.+0.5*$z); $r =$t*exp(-$z*$z-1.26551223+ $t*(1.00002368+ $t*(.37409196+ $t*(.09678418+ $t*(-.18628806+ $t*(.27886807+ $t*(-1.13520398+ $t*(1.48851587+ $t*(-.82215223+ $t*.17087277))))))))); if($x>=0){ return $r; }else{ return 2-$r; } } /** * @name 获取平均值 * @param [array] $list 计算的数组 * @return [number] 计算的平均值 */ public function getMu($list){ return array_sum($list)/count($list); } /** * @name 获取标准差 * @param [array] $list 计算的数组 * @return [number] 方差的平方根,既标准差 */ public function getSigma($list){ $total_var = 0; foreach($list as $v){ $total_var += pow(($v-$this->getMu($list)),2); } return sqrt($total_var/(count($list)-1));//这里数组个数为什么要减去1 } /** * @name 概率出现某个键值对 * @param $proArr [array] 一维数组 例如奖品名=>奖品概率 * @return $result [string] 奖品名 */ function get_rand($proArr){ $result = ''; $proSum = array_sum($proArr); foreach($proArr as $key => $val){ $randNum = mt_rand(1,$proSum); if($randNum<=$val){ $result = $key; break; }else{ $proSum -=$val; } } unset($proArr); return $result; } /** * [getRandom] * @param [Array] $array 数值组 * @param [String] $rate 概率组 * @return [type] [description] */ function getRandom($array,$rate){ $rate = explode(':',$rate); $sum = 0;$left = 0;$right = 0; foreach($rate as $value){ $sum+=$value*10; } $temp = rand(0,$sum); foreach($rate as $key => $value){ $right+=$value*10; if($left<=$temp&&$right>=$temp){ return $array[$key]; } $left+=$value*10; } } } //use $list = array(1.09,1.50,1.31,1.44); $normdist = new Normdist($list); echo $normdist->getCdf($list[0]); //use $price_arr = array('a'=>20,'b'=>30,'c'=>10,'d'=>40); print($normdist->get_rand($price_arr)); //use //$array = array(0,1,2,3,4,5); $array = array('萝卜','苹果','石榴','番茄','柚子','椰子'); $rate = '2:1:1:1:2:3'; $a=$b=$c=$d=$e=$f=0; for($i=0;$i<1100;$i++){ if($normdist->getRandom($array,$rate)==$array[0]){ echo $array[0]; $a++; } if($normdist->getRandom($array,$rate)==$array[1]){ echo $array[1]; $b++; } if($normdist->getRandom($array,$rate)==$array[2]){ echo $array[2]; $c++; } if($normdist->getRandom($array,$rate)==$array[3]){ echo $array[3]; $d++; } if($normdist->getRandom($array,$rate)==$array[4]){ echo $array[4]; $e++; } if($normdist->getRandom($array,$rate)==$array[5]){ echo $array[5]; $f++; } } echo $a; echo "\n"; echo $b; echo "\n"; echo $c; echo "\n"; echo $d; echo "\n"; echo $e; echo "\n"; echo $f; echo "\n";