抽奖算法

mervyn 2019年4月4日00:30:53数据结构与算法抽奖算法已关闭评论2954

<?php

/*
 * 经典的概率算法,
 * 数组中 probability 的总和(基数),基数越大越能体现概率的准确性。
 * probability 的总和为100,那么 iPhone XR 对应的中奖概率就是1%,
 * 如果 probability 的总和是10000,那中奖概率就是万分之一了。
 */
function getPrize($prizes) {
    //概率数组的总概率精度
    $sum = array_sum(array_column($prizes, 'probability'));
    foreach ($prizes as $key => $item) {
        $rand = mt_rand(1, $sum);
        if($rand <= $item['probability']) {
            $result = $item;
            break;
        }

        $sum -= $item['probability'];
    }

    return $result;

}

/*
* 奖项数组
* level 表示中奖等级,prize 表示奖品,probability 表示中奖概率。
* probability 为0即意味着该奖项抽中的几率是0,
*
*
*/
$prizes = [
    ['level' => 1, 'prize' => 'iPhone XR', 'probability' => 5],
    ['level' => 2, 'prize' => 'iPhone X', 'probability' => 10],
    ['level' => 3, 'prize' => '华为 P20', 'probability' => 15],
    ['level' => 4, 'prize' => '小米 Note', 'probability' => 25],
    ['level' => 5, 'prize' => '谢谢参与', 'probability' => 45],
];

$result = getPrize($prizes);
var_export($result);
文章源自编程技术分享-https://mervyn.life/2a0c86cd.html
weinxin
我的微信公众号
微信扫一扫
mervyn