中奖概率
PHP笔记
0
933
// 中奖 算法一
public function winning1()
{
// 中奖率设置
$r = $this->probability(["特" => 0.1 "一" => 0.5 "二" => 1.5 "三" => 10 "四" => 20]);
echo $r == false ? "未中奖" : $r . "等奖";
}
// 概率
public function probability($data)
{
// $n = rand(0 100);
$n = $this->randomFloat(); // 获取 0.0 到 100.0 的随机数
$temp = 0;
// array(5) {
// ["特"] => float(0.1)
// ["一"] => float(0.5)
// ["二"] => float(1.5)
// ["三"] => int(10)
// ["四"] => int(20)
// }
foreach ($data as $k => $v) {
// $v的值 0.1 0.5 1.5 10 20
// $temp += $v; // $temp的值 0.1 0.6 2.1 12.1 32.1
if ($n <= $v) {
return $k;
}
}
return false;
}
// 随机数
public function randomFloat($min = 0 $max = 100)
{
$num = $min + mt_rand() / mt_getrandmax() * ($max - $min);
return sprintf("%.1f" $num); // 控制小数后几位
}
// 中奖 算法二
public function winning2()
{
$prize_arr = array(
'0' => array('id' => 1 'prize' => '平板电脑' 'v' => 1)
'1' => array('id' => 2 'prize' => '数码相机' 'v' => 5)
'2' => array('id' => 3 'prize' => '音箱设备' 'v' => 10)
'3' => array('id' => 4 'prize' => '4G优盘' 'v' => 12)
'4' => array('id' => 5 'prize' => '10Q币' 'v' => 22)
'5' => array('id' => 6 'prize' => '下次没准就能中哦' 'v' => 50)
);
$v_sum = array();
foreach ($prize_arr as $v) {
array_push($v_sum $v['v']);
}
$rr = $this->get_rand($v_sum);
echo $prize_arr[$rr]['prize'];
}
public function winning22()
{
$prize_arr = array(
'0' => array('id' => 1 'prize' => '平板电脑' 'v' => 1)
'1' => array('id' => 2 'prize' => '数码相机' 'v' => 5)
'2' => array('id' => 3 'prize' => '音箱设备' 'v' => 10)
'3' => array('id' => 4 'prize' => '4G优盘' 'v' => 12)
'4' => array('id' => 5 'prize' => '10Q币' 'v' => 22)
'5' => array('id' => 6 'prize' => '下次没准就能中哦' 'v' => 50)
);
// 如果中奖数据是放在数据库里,这里就需要进行判断中奖数量
// 在中1、2、3等奖的,如果达到最大数量的则unset相应的奖项,避免重复中大奖
// code here eg:unset($prize_arr['0'])
foreach ($prize_arr as $key => $val) {
$arr[$val['id']] = $val['v'];
}
$rid = $this->get_rand($arr); // 根据概率获取奖项id
$res['yes'] = $prize_arr[$rid - 1]['prize']; // 中奖项
// 将中奖项从数组中剔除,剩下未中奖项,如果是数据库验证,这里可以省掉
unset($prize_arr[$rid - 1]);
shuffle($prize_arr); // 打乱数组顺序
for ($i = 0; $i < count($prize_arr); $i++) {
$pr[] = $prize_arr[$i]['prize'];
}
$res['no'] = $pr;
echo json_encode($res);
}
// 算法二
public function get_rand($proArr)
{
$result = '';
// 概率数组的总概率精度
$proSum = array_sum($proArr); // 值100
// 概率数组循环
foreach ($proArr as $key => $proCur) {
// $proCur的值 1 5 10 12 22 50
$randNum = mt_rand(1 $proSum); // 1-100
if ($randNum <= $proCur) { // 中奖
$result = $key; // 返回数组的键
break;
} else { // 未中将
$proSum -= $proCur;
}
}
unset ($proArr);
return $result;
}
发表评论