最近做抽奖的活动

1.抽奖算法简化如下:

function choujiang($config)
{
    $isOk = 0;
    foreach ($config['Win'] as $key => $value) {
        if ($value['upperLimit'] > $value['existing']) {
            $isOk = 1;
        }
    }
    if ($isOk === 0) return "所有商品都被中完了";

    $mt_rand = mt_rand(0, 9999); // mt_rand比rand效率要高4倍
    if ($mt_rand < $config['NoWin']['probability']) {
        return '对不起,你没有中奖';
    } else {
        $sum = array_sum(array_column($config['Win'], 'probability'));
        if ($sum !== 10000) return '概率和不等于10000';
        return gailv($config['Win']);
    }
}

function gailv($config)
{
    $mt_rand = mt_rand(0, 9999);
    $begin = 0;
    foreach ($config as $key => $value) {
        if ($mt_rand >= $begin && $mt_rand < $begin + $value['probability']) {
            if ($value['upperLimit'] <= $value['existing']) {
                return gailv($config);
            } else {
                return "恭喜您中奖了,商品id:{$value['product_id']},商品名:{$value['product_name']}";
            }
        }
        $begin += $value['probability'];
    }
}

/*
    不中奖概率:80.00%
    中奖概率:20.00%,其中:中product1的概率:10.00%, 此种奖品数:500个,已经中了200个
*/

$config = [
    'NoWin' => ['probability' => 8000],
    'Win' => [
        ['product_id' => 1, 'product_name' => 'product1', 'probability' => 1000, 'upperLimit' => 500, 'existing' => 200],
        ['product_id' => 2, 'product_name' => 'product2', 'probability' => 2000, 'upperLimit' => 500, 'existing' => 500],
        ['product_id' => 3, 'product_name' => 'product3', 'probability' => 3000, 'upperLimit' => 500, 'existing' => 200],
        ['product_id' => 4, 'product_name' => 'product4', 'probability' => 4000, 'upperLimit' => 500, 'existing' => 200],
    ]
];

echo choujiang($config);

转载于:https://www.cnblogs.com/wangweiwen/p/6217221.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值