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

 PHP进阶  2020-01-20  admin  4524  6107

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

/**
 * 经典的概率算法,
 * $arrPrize是一个预先设置的奖品数组,
 * 假设数组为:array(100,200,300,400),
 * 开始是从1,1000 这个概率范围内筛选第一个数是否在出现概率范围之内,
 * 如果不在, 则将概率空间的值减去刚刚的那个数字的概率空间,
 * 在本例当中就是减去100, 也就是说第二个数是在1,900这个范围内筛选的
 * 这样筛选到最终,总会有一个数满足要求。
 * 就相当于去一个箱子里摸东西,第一个不是, 第二个不是, 第三个还不是, 那最后一个一定是。
 * 算法简单而且效率非常高
 * @param $arrPrize
 * @return int|string
 * @author code.cent123.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,
    ),
);


如果文章对您有帮助,点击下方的广告,支持一下作者吧!

相关推荐


酷炫的倒计时客户端

QQ: 425100867捐赠开发者:

go 的加减乘除运算注意事项,及相互转化问题

packagemain import( &quot;fmt&quot; ) funcmain(){ varintAint=10 varintBint=9 varfloatAfloat64=10 varfloatBfloat64=9 //在Go语言中,操作数的类型必须匹配。也就是说,进行运算时,操作数的类型必须一致或能够进行合理的转换。 //具体来说

AI人脸替换工具离线版V6.0 最新版下载

AI人脸替换工具离线版V6.0 最新版下载下载 解压 双击运行roop_rope_facefusion_V60.exe 文件即可下载链接:https://pan.quark.cn/s/be7953632126AI人脸替换工具离线版V6.0

Android各个版本与API等级之间的对应关系

API等级 1 - 3:Android 1.0 (Astro,也被称为“铁臂阿童木”)Android 1.1 (Petit Four,即“花色小蛋糕”)Android 1.5 (Cupcake)API等级 4:Android 1.6 (Donut)API等级 5 - 7:Android 2.0/2.0.1/2.1 (Éclair)API等级 8:Android 2.2/2.2.3 (Froyo)A