先定义一个公共方法获取随机值
<?php
// 应用公共文件
function getRand($proArr)
{
print_r($proArr);
$result = '';
//概率数组的总概率精度
$proSum = array_sum($proArr);
//概率数组循环
foreach ($proArr as $key => $proCur) {
// 生成范围内随机值
$randNum = mt_rand(1, $proSum);
// 判断是否在当前范围内,如果是记录key,如果不是则在总概率中减去当前范围,并继续判断下一个
if ($randNum <= $proCur) {
$result = $key;
break;
} else {
// (缩小范围)
$proSum -= $proCur;
}
}
unset ($proArr);
// 返回key
return $result;
}
控制器执行
<?php
declare (strict_types = 1);
namespace app\admin\controller;
use app\common\controller\SnowFlake;
use think\cache\driver\Redis;
class Index
{
public function index()
{
$redis = new Redis();
//设置多个字段值
$prizeArr = [
['prize' => '一等奖', 'v' => 1],
['prize' => '二等奖', 'v' => 5],
['prize' => '三等奖', 'v' => 10],
['prize' => '四等奖', 'v' => 12],
['prize' => '五等奖', 'v' => 22],
['prize' => '未中奖', 'v' => 50],
];
$arr = [];
foreach ($prizeArr as $k => $v){
$autoID=$redis->exists('choujiang_'.$k);
if (!$autoID) {
$redis->hMSet('choujiang_'.$k, $v);
}else{
$val = $redis->hMGet('choujiang_'.$k, ['v']);
if($val['v']){
$arr[$k] = $val['v'];
}
}
}
// 获取抽中的key
$rid = getRand($arr);
$val = $redis->hMGet('choujiang_'.$rid, ['v']);
$redis->hMSet('choujiang_'.$rid, ['v'=>$val['v']-1]);
// 获取结果
echo $prizeArr[$rid]['prize'];
}
}