当前位置 : 主页 > 网络编程 > PHP >

概率算法

来源:互联网 收集:自由互联 发布时间:2021-06-28
概率算法.php '0.1000000000','id'=1], ['probability'='0.3000000000','id'=2], ['probability'='0.6000000000','id'=3],];$d=10; // 小数点精度$count = 10**$d; // 总球数/** * 原理说明: * 精度为10,总球数为10**10,概率**10得
概率算法.php
 '0.1000000000','id'=>1],
    ['probability'=>'0.3000000000','id'=>2],
    ['probability'=>'0.6000000000','id'=>3],
];
$d=10; // 小数点精度
$count = 10**$d; // 总球数

/**
 * 原理说明:
 * 精度为10,总球数为10**10,概率**10得出每个概率对应的球数:
 * 1000000000,3000000000,6000000000
 * 从总球数中取一个随机数
 * 如果数值落在区间 1~1000000000 则中1
 * 如果数值落在区间 1000000000~(1000000000+3000000000) 则中2
 * 如果数值落在区间 4000000000~(4000000000+6000000000) 则中3
 */

$probs = []; // prize_id=>概率
$win_prize_id =0;
foreach ($prizes as $k => $v) {
    if($v['probability']-0){ // 如果设置了概率
        if($v['probability']>=1){
            $win_prize_id =$v['id'];
            break;
        }
        $probs[$v['id']] = ($v['probability']*$count); // 概率对应的球数
    }
}

if($win_prize_id==0){
    $rand=mt_rand(1,$count); // 随机取出一个球
    asort($probs); // 按概率排序,并保留prize_id
    $sep = 0;
    foreach ($probs as $prize_id=>$prob ) {
        if($rand<=$prob+$sep){ // 如果小球在第一个奖品的数值范围内就中奖
            $win_prize_id = $prize_id;
            break;
        }
        $sep+=$prob;
    }
}
echo $win_prize_id;
上一篇:Memcache基础教程
下一篇:这个是测试
网友评论