网站首页 文章专栏 转盘抽奖/概率抽奖算法
转盘抽奖/概率抽奖算法
编辑时间:2021-08-10 23:16:02 作者:Echosong 浏览量:866

场景:

          常见的转盘抽奖或者天降宝箱等概率抽奖

思路:

          1.将每个奖品和概率设置为二维数组, key为奖品id,概率为value. 例如: 

                  $proArr = [

                       ['id'=>1, 'probability'=>100],

                       ['id'=>2, 'probability'=>500],

                      ['id'=>3, 'probability'=>1000],

                  ]   

               1为0.3元奖励,2为500积分,3谢谢光临

          2.计算出概率之和proSum

          3.在1和proSum之间求随机数randSum,随机数和每个奖品的概率比较。如果<=奖品的概率,那么是抽中,如果>奖品的概率,未抽中,概率之和proSum减去随机数接着遍历。

         

代码:    

    $proArr =  ['1'=>100, '2'=>500, '3'=>1000];

    public static function get_rand($proArr) {
        $result = '';
        $proSum = array_sum($proArr); 
        foreach ($proArr as $key => $proCur) {
            $randNum = mt_rand(1, $proSum);
            if ($randNum <= $proCur) {
                $result = $key;
                break;
            } else {
                $proSum -= $proCur;
            }
        }
        unset($proArr);
        return $result;
    }


来说两句吧
最新评论
  • a 2021-08-13 15:16:06
    a
  • hi 2021-10-10 16:36:26

    方法1 数组 里面 有 100个 id1  500个 id2 1000个id3 ,从此数组随机抽出一个奖品

    方法2 100+500+1000   从1~1600中奖随机取一个数 再去对比 得出奖品 

    方法1 方法2  都是随机 ,会不会概率不一样?

  • 作者 2021-10-14 15:04:35
    @hi, 方法1是指随机的数在100内取id1,  100-500取id2,  500-1000取id3吗?