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

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

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

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

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

可以创建 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));

我的想法是这样,条件就不说了,写if判断都行
不同的概率嘛,直接rand生成1-100随机数
1%概率就是随机数是1的为中奖
10%的就是随机数是1-10的为中奖
依次类推
你可以参考一下

写一个函数,类似以下:

function gailv($value){
    $gailv=0;
    switch($value){
        case '1':
            $gailv=1;
            break;
        case '1':
            $gailv=5;
            break;
        case '3':
            $gailv=8;
            break;
        case '4':
            $gailv=10;
            break;
        default:
            $gailv=0;
    }
    return $gailv;
}

调用时只要

gailv(2)
//这样调用就可以了

建议先把需求梳理清楚,再来设计算法比较有针对性。