php 可控制几率算法,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);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值