有关抽奖的概率计算问题

中奖转盘抽奖参考原文链接   https://www.helloweba.com/view-blog-216.html

翻牌子抽奖参考原文链接  https://www.helloweba.com/view-blog-184.html

最近接触到一些翻牌,抽奖的问题,然后就上网查找了一些计算概率的方法,自己试了试,下边为例子说明

/**
 * 奖项配置中奖的概率一级中奖等级配置
 */
public function actionCeshi()
{
    $prize_arr = array(
        '0' => array('id' => 1, 'prize' => '平板电脑', 'v' => 1),
        '1' => array('id' => 2, 'prize' => '数码相机', 'v' => 5),
        '2' => array('id' => 3, 'prize' => '音箱设备', 'v' => 10),
        '3' => array('id' => 4, 'prize' => '4G优盘', 'v' => 12),
        '4' => array('id' => 5, 'prize' => '10Q', 'v' => 22),
        '5' => array('id' => 6, 'prize' => '下次没准就能中哦', 'v' => 50),
    );
    foreach ($prize_arr as $key => $val) {
        $arr[$val['id']] = $val['v'];
        /*   $arr = Array
           (
               [1] => 1,
               [2] => 5,
               [3] => 10,
               [4] => 12,
               [5] => 22,
               [6] => 50,
           );*/
    }

    $rid = $this->Lists($arr); //根据概率获取奖项id
    $res['yes'] = $prize_arr[$rid - 1]['prize']; //中奖项
    unset($prize_arr[$rid - 1]); //将中奖项从数组中剔除,剩下未中奖项
    shuffle($prize_arr); //打乱数组顺序
    for ($i = 0; $i < count($prize_arr); $i++) {
        $pr[] = $prize_arr[$i]['prize'];
    }
    $res['no'] = $pr;   // 除了中奖外的其他数据

    echo json_encode($res);
}


/**
 * 随机算法 计算中奖率
 *
 * @param array 需要随机的一维数组
 *              ['10', '20', '30']
 *
 * @return str 返回数组中的一个值
 *             10
 */
public function Lists($pro_arr)
{
    /*      $pro_arr = Array
          (
              [0] => 10,
              [1] => 20,
              [2] => 30,
          );*/
    $result = '';
    // 概率数组的总概率精度
    $pro_sum = array_sum($pro_arr);//60

    // 概率数组循环
    foreach ($pro_arr as $key => $pro_cur) {
        $rand_num = mt_rand(1, $pro_sum);//生成1-60的随机数,mt_rand(min,max)

        if ($rand_num <= $pro_cur) {//如果生成的随机数小于等于10,20,30的值
            $result = $key;//result等于0,1,2key            break;
        } else {
            $pro_sum -= $pro_cur;//60-=10,20,30
        }
    }

    unset ($pro_arr);
    return $result;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值