登录

中奖概率

PHP笔记
0 522
  // 中奖 算法一
    public function winning1()
    {
        // 中奖率设置
        $r = $this->probability(["特" => 0.1 "一" => 0.5 "二" => 1.5 "三" => 10 "四" => 20]);
        echo $r == false ? "未中奖" : $r . "等奖";
    }

    // 概率
    public function probability($data)
    {
        // $n = rand(0 100);
        $n = $this->randomFloat(); // 获取 0.0 到 100.0 的随机数
        $temp = 0;
        // array(5) {
        //      ["特"] => float(0.1)
        //      ["一"] => float(0.5)
        //      ["二"] => float(1.5)
        //      ["三"] => int(10)
        //      ["四"] => int(20)
        //  }
        foreach ($data as $k => $v) {
            // $v的值 0.1   0.5   1.5   10   20
            // $temp += $v; // $temp的值 0.1   0.6   2.1   12.1   32.1
            if ($n <= $v) {
                return $k;
            }
        }
        return false;
    }

    // 随机数
    public function randomFloat($min = 0 $max = 100)
    {
        $num = $min + mt_rand() / mt_getrandmax() * ($max - $min);
        return sprintf("%.1f" $num); // 控制小数后几位
    }


    // 中奖 算法二
    public function winning2()
    {
        $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)
        );
        $v_sum = array();
        foreach ($prize_arr as $v) {
            array_push($v_sum $v['v']);
        }
        $rr = $this->get_rand($v_sum);
        echo $prize_arr[$rr]['prize'];
    }

    public function winning22()
    {
        $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)
        );
        // 如果中奖数据是放在数据库里,这里就需要进行判断中奖数量
        // 在中1、2、3等奖的,如果达到最大数量的则unset相应的奖项,避免重复中大奖
        // code here eg:unset($prize_arr['0'])
        foreach ($prize_arr as $key => $val) {
            $arr[$val['id']] = $val['v'];
        }

        $rid = $this->get_rand($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);
    }

    // 算法二
    public function get_rand($proArr)
    {
        $result = '';

        // 概率数组的总概率精度
        $proSum = array_sum($proArr); // 值100

        // 概率数组循环
        foreach ($proArr as $key => $proCur) {
            // $proCur的值  1 5 10 12 22 50
            $randNum = mt_rand(1 $proSum); // 1-100
            if ($randNum <= $proCur) { // 中奖
                $result = $key; // 返回数组的键
                break;
            } else { // 未中将
                $proSum -= $proCur;
            }
        }
        unset ($proArr);
        return $result;
    }

发表评论

0 个回复