不啰嗦,直接上代码
<?php
class LuckDrawTest
{
private $number_rand = [] ; // 中奖号码 不重复
private $number_arr = [] ; // 已经获得本次部分
private $number_num ; // 中奖总概率
private $number_sum = 0 ; // 单次概率 即获得中奖号码个数
private $luck_num = 0 ; // 中奖号码
private $is_luck = 0 ;
private $luck_arr = [] ; // 中奖信息
public function __construct()
{
$this->number_num = 100 ; // pro 比例 百分之1 则为 100 万分之1 则为 10000
}
// 全概率计算
public function index()
{
// 全部有效奖品
$prize_arr = [
['id'=>1, 'name'=>'10000元现金大礼包','pro'=>1],
['id'=>2, 'name'=>'5000元现金中礼包','pro'=>2],
['id'=>3, 'name'=>'2000元现金红包','pro'=>5],
['id'=>4, 'name'=>'1000元现金','pro'=>10],
['id'=>5, 'name'=>'500元购物券','pro'=>20],
['id'=>6, 'name'=>'200元奖品','pro'=>20],
] ;
$this->luck_num = $this->get_rand() ; // 抽的号码
$arr = [] ; // 获奖号码
foreach ($prize_arr as $k=>$v){
$this->number_sum = $v['pro'] ; // 对比开奖号码个数 即概率
$this->number_arr = [] ; // 重置单次中奖号码
$this->get_rand(1) ; // 获得开奖号码
$arr[$k] = $this->number_arr ; //
if($this->is_luck){ // 如果已经中奖 则终止出号, 如果多人参与则 调整此处逻辑
$this->luck_arr = $v ; break ; // 获得奖品id 取id 为了
}
}
if(empty($this->luck_arr)){ // 判断是否已经中奖 如果有参与奖或者必得参与奖则在此处理
$str = '下次没准就能中哦' ;
}else{
$str = $this->luck_arr['name'] ; // 获得奖品标题
}
echo '我的号码:'. $this->luck_num . "\r\n我的奖品:" . $str."\r\n";
print_r($arr) ; // 全部开奖号码
}
public function get_rand($t=0)
{
$read_number = mt_rand(1, $this->number_num) ;
if(!$t) return $read_number ; // 幸运号码
if(!in_array($read_number, $this->number_rand)){ // 随机数不存在已中奖号码中
$this->number_arr[] = $read_number ; // 本次奖品中奖号码
$this->number_rand[] = $read_number ; // 全部中奖号码
$this->number_sum -- ;
if(in_array($this->luck_num, $this->number_arr)){ // 判断是否已中奖
$this->is_luck = 1 ;
return true ;
}
}
return $this->number_sum == 0 ? true : $this->get_rand(1) ; //
}
}
外部直接调用
$t = new LuckDrawTest() ;
return $t->index() ;
其它项目逻辑自行处理
|