php中奖概率算法,刮刮卡,大转盘等抽奖算法

 PHP进阶  2020-01-20  admin  2701  3646

php中奖概率算法,刮刮卡,大转盘等抽奖算法

/**
 * 经典的概率算法,
 * $arrPrize是一个预先设置的奖品数组,
 * 假设数组为:array(100,200,300,400),
 * 开始是从1,1000 这个概率范围内筛选第一个数是否在出现概率范围之内,
 * 如果不在, 则将概率空间的值减去刚刚的那个数字的概率空间,
 * 在本例当中就是减去100, 也就是说第二个数是在1,900这个范围内筛选的
 * 这样筛选到最终,总会有一个数满足要求。
 * 就相当于去一个箱子里摸东西,第一个不是, 第二个不是, 第三个还不是, 那最后一个一定是。
 * 算法简单而且效率非常高
 * @param $arrPrize
 * @return int|string
 * @author centphp.com
 */
function getRandPrize($arrPrize)
{
    $result = '';
    //总概率
    $proSum = array_sum(array_column($arrPrize, 'probability'));
    //概率数组循环
    foreach ($arrPrize as $key => $val) {
        $randNum = mt_rand(1, $proSum);
        if ($randNum <= $val['probability']) {
            $result = $key;
            break;
        } else {
            $proSum -= $val['probability'];
        }
    }
    return $result;
}

模拟10000次抽奖,验证中奖概率和分布

/**
 * 奖项数组
 * probability 表示中奖概率
 */
$arrPrize = [
    ['id' => 1, 'prize' => '一等奖', 'probability' => 1, 'amount' => 10],
    ['id' => 2, 'prize' => '二等奖', 'probability' => 5, 'amount' => 10],
    ['id' => 3, 'prize' => '三等奖', 'probability' => 10, 'amount' => 10],
    ['id' => 4, 'prize' => '四等奖', 'probability' => 12, 'amount' => 10],
    ['id' => 5, 'prize' => '五等奖', 'probability' => 22, 'amount' => 10],
    ['id' => 6, 'prize' => '谢谢参与', 'probability' => 50, 'amount' => 10],
];

for ($i = 0; $i < 10000; $i++) {
    $res[] = getRandPrize($arrPrize);
}

$res2 = array_count_values($res);
ksort($res2);
foreach ($res2 as $key => $val) {
    $res3[$key]['count'] = $val;
    $res3[$key]['probability'] = $val / count($res) * 100;
}

print_r($res3);

模拟10000次的一个结果

array(
    array(
        'count' => 103,
        'probability' => 1.03,
    ),
    array(
        'count' => 510,
        'probability' => 5.1,
    ),
    array(
        'count' => 981,
        'probability' => 9.81,
    ),
    array(
        'count' => 1211,
        'probability' => 12.11,
    ),
    array(
        'count' => 2155,
        'probability' => 21.55,
    ),
    array(
        'count' => 5040,
        'probability' => 50.4,
    ),
);


相关推荐


Laravel自定义表单验证规则,添加验证规则

Laravel 提供了许多有用的验证规则;同时也支持自定义规则。在服务容器中使用这个方法来注册自定义验证规则: Laravel 自定义规则实现手机号、身份证号、密码强度的验证

Linux查看杀死被占用的端口

Linux查看并杀死被占用的端口sudo apt-get install lsof   //安装lsof,一般默认安装了sudo lsof -i:端口号      //查找对应的进程号sudo kill -9 进程号      //杀死对应的进程 lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof

php根据总金额生成指定个数的随机红包,红包算法

php根据总金额生成指定个数的随机红包,红包算法/** *根据总金额生成指定个数的随机红包 *1、微信红包,每人最少分得1分钱 *2、每人分得到的金额是随机分配的 *3、每次生成红包就生成了对应领取红包的结果 *生成随机红包 *ClassredPacket */ classredPacket { //总金额 private$total=0; //红包数量 private$

php数字转人民币金额大写

数值转人民币大写/** *数字转人民币金额大写 *ClassExt_Num2Cny */ classNumber2Cny { static$basic=array(0=&gt;&quot;零&quot;,&quot;壹&quot;,&quot;贰&quot;,&quot;叁&quot;,&quot;肆&quot;,&quot;伍&quot;,&quot;陆&quot;,&quot;柒&