PHP实现中奖概率算法

假设我们的奖品是如下:

$prize = array(   
    '0' => array('id'=>1,'prize'=>'ipad','v'=>1),   
    '1' => array('id'=>2,'prize'=>'iphone9','v'=>5),   
    '2' => array('id'=>3,'prize'=>'小米音箱','v'=>10),   
    '3' => array('id'=>4,'prize'=>'4GU盘','v'=>12),   
    '4' => array('id'=>5,'prize'=>'10Q币','v'=>22),   
    '5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),   
);   

v表示中奖占比,比如说所有v加起来是100,而这里的ipad为1,表示中奖概率为1%。

算法思路
$data为一个预设的数组,假设数组为[100,200,300,400],最开始数据从1,1000这个范围内选一个数出来,如果不在这个范围内,则缩小范围,在这个例子中就是减去100,也就是第二个数在1,900这个范围内筛选,这样一直下去总会有一个满足要求。相当于在一个盒子里拿小球,第一个不是,第二个不是,第三个不是。。。全部取完,总会有一个是。

 function gen_rand($data) {
        $result = '';
        $sum = array_sum($data); //计算总权重
        foreach($data as $key => $val) {
            $randNum = mt_rand(1, $sum);
            if($randNum <= $val) {
                $result = $key;
                break;
            } else {
                $sum -= $val;
            }
        }
        unset($data);
        return $result;
    }

生成$data数组的方法

$keys = array_keys($prize);
$vals = array_column($prize, 'v');
$data = array_combine($keys,$vals);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容