PHP这种有概率的类似于抽奖的算法应该怎么搞呢?
有100个用户,有的用户中奖概率是1%,有的是10%、5%、8%等等。
概率可能有很多个,但是每个用户对应一个概率,概率是其他特定的条件参数生成的概率。
然后根据每个用户对应的概率从100个用户里面抽取一个或者两个用户出来为中奖
求各位指点下如何用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));