最近在写一个小程序,关于抽奖概率的问题,可以自由上传抽奖商品,每个商品是独立的,可以单独设置商品
比如
苹果抽中的概率是0.001
香蕉抽中的概率是0.01
橘子抽中的概率是0.05
鸭梨抽中的概率是5
谢谢惠顾的概率是100
我在这里提供一个思路,就是按照概率从小到大排序,然后取整 所以这里概率不能存在俩位大于零的数字 比如,抽中一个物品的概率是0.32或者是0.69,只能是小于100的整数 或者小数点后只能有一位数字!
那么苹果的倍率就是1000,整数是1 所以$data=mt_rand(1,1000) ; 如果随机数小于等于整数就表示抽中,则结束本次抽奖
如果 苹果,香蕉,橘子,鸭梨 按照这个顺序都没有抽中,则最后抽奖结果会在谢谢惠顾100%上!
下面是示例
public function new_get_rand($proArr){
$result = array();
//传入数组只取出概率
foreach ($proArr as $key => $val) {
$arr[$key] = $val['v'];
}
//按照概率排序
asort($arr);
// 概率数组循环
foreach ($arr as $k => $v) {
$proSum=1;
while(true){
//取出整数
$backjinzhi=$v*$proSum;
if($backjinzhi>=1){
$proSum=$proSum;
break;
}else{
$proSum=$proSum*10;
}
}
$proSumhead=$v*$proSum;
$proSum=$proSum*100;
$randNum = mt_rand(1, $proSum);
echo "随即数:".$randNum."<".$proSumhead."</br>";
echo "rand:".$proSum."=</br>";
echo "v:".$proSumhead."=</br>";
if ($randNum <= $proSumhead) {
$result = $proArr[$k];
break;
}
}
return $result;
}