weixin_46751464 2022-11-07 15:11 采纳率: 100%
浏览 91
已结题

PHP这种有概率的类似于抽奖的算法应该怎么搞呢?

PHP这种有概率的类似于抽奖的算法应该怎么搞呢?

有100个用户,有的用户中奖概率是1%,有的是10%、5%、8%等等。

概率可能有很多个,但是每个用户对应一个概率,概率是其他特定的条件参数生成的概率。
然后根据每个用户对应的概率从100个用户里面抽取一个或者两个用户出来为中奖

求各位指点下如何用PHP写这种算法。

  • 写回答

4条回答 默认 最新

  • 谢玄. 2022-11-07 16:13
    关注

    可以创建 100 个人的对象 然后分别抽奖 直到剩下的人 符合 《= n 那么就是那些人;大致实现如下。不懂可以再问。

    <?php
    
    // 创建一个对象 
    class Lotto
    {
        var $manList = [];
        // 添加成员
        function add_man($man)
        {
            array_push($this->manList, $man);
        }
        // 全员抽奖 直到刚刚好只有 n 个人中奖
        function lotto_($n)
        {
            $nowList = $this->manList;
            $flag = count($nowList);
            // 如果中奖人数 > n 就继续抽奖
            while ($flag > $n) {
                // 遍历所有剩下的人 让他们抽奖
                foreach ($nowList as $key => $value) {
                    // 如果剩下的 只有 n 个或者 不到 n个 那么剩下的人就是中奖的人
                    if (count($nowList) <= $n) {
                        return  $nowList;
                    }
                    if ($value->lotto_()) {
                        // 中奖留下
                    } else {
                        // 不中奖删去 并且 踢出 中奖列表里
                        unset($nowList[$key]);
                        $nowList = array_values($nowList);
                    }
                } // 遍历所有剩下的人 让他们抽奖
    
                $flag = count($nowList);
            } // 如果中奖人数 >= n 就继续抽奖
            // 中奖人数 <= n 了 可以确定是谁中奖了
            return  $nowList;
        }
    };
    
    class Man
    {
        var $probabli = 0; //概率
        var $win = false;
        function lotto_()
        {
            // 抽奖
            if (rand(0, 100) > $this->probabli) {
                $this->win = true;
                return true;
            } else {
                $this->win = false;
                return false;
            }
        }
    
        function get_win()
        {
            return $this->win;
        }
    };
    
    // 定义 4 个人
    $a = new Man();
    $b = new Man();
    $c = new Man();
    $d = new Man();
    
    // 设置他们的中奖概率
    $a->probabli = 10;
    $b->probabli = 20;
    $c->probabli = 30;
    $d->probabli = 100;
    
    // 定义 抽奖箱
    $box = new Lotto();
    
    // 这4个人加入抽奖箱
    $box->add_man($a);
    $box->add_man($b);
    $box->add_man($c);
    $box->add_man($d);
    
    // 抽2个人并输出结果
    print_r($box->lotto_(2));
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月16日
  • 已采纳回答 11月8日
  • 修改了问题 11月7日
  • 赞助了问题酬金1元 11月7日
  • 展开全部

悬赏问题

  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀