public function demo(){
$percent = [
'SSS' => [
'percent'=>0.5,
'number'=>0
],
'SSS2' => [
'percent'=>0.5,
'number'=>0
],
'SS1' => [
'percent'=>1,
'number'=>0
],
'SS2' => [
'percent'=>1,
'number'=>0
],
'SS3' => [
'percent'=>1,
'number'=>0
],
'S1' => [
'percent'=>2,
'number'=>0
],
'S2' => [
'percent'=>2,
'number'=>0
],
'A' => [
'percent'=>5,
'number'=>0
],
'B' => [
'percent'=>10,
'number'=>0
],
'C' => [
'percent'=>77,
'number'=>0
],
];
$times = 3000;
for ($i = 0; $i < $times; $i++){
$result = $this->demo1($percent);
if(!isset($percent[$result])){
$percent[$result] = [
'number'=>0
];
}
$percent[$result]['number'] = $percent[$result]['number'] + 1;
}
foreach ($percent as $k => $v){
$percent[$k]['real_percent'] = round($percent[$k]['number'] / $times * 100,2);//真实获取概率
}
dump($percent);
}
public function demo1($prize)
{
$arr = [];
foreach ($prize as $k => $v) {
$num = $v['percent'] * 10;
$arr_percent = array_pad([], $num, $k);//将奖品增加到数组中
$arr = array_merge($arr, $arr_percent);
}
shuffle($arr);
$key = array_rand($arr, 1);//随机奖品
$value = $arr[$key];
// 中奖返回中奖数据
return $value;
}
//随机打乱数组顺序并保持数组键值不变
public function rand_array($array){
$key = array_keys($array);
shuffle($key);
$data = [];
foreach ($key as $k=>$v){
$data[$v] = $array[$v];
}
return $data;
}
抽奖的算法
于 2023-08-23 16:44:48 首次发布