CodeIgniter-Lottery - php ci 抽奖辅助函数
Github
用法
1、 移入文件
将lottery_helper.php
放在你的工程根目录/application/helpers/
2、导入辅助函数
$this->load->helper('lottery');
3、调用
//抽奖,返回奖品id
$price_id = lottery($arr);
echo $price_id;
关于$arr
参数的规范有下面两种方式:
方法一:直接传 array 参数
$arr = array(
array(
"id" => 1,
"rate" => 0.1,
),
array(
"id" => 2,
"rate" => 0.2345,
),
array(
"id" => 3,
"rate" => 0,
)
);
注:
方法二:利用 $query->result_array()
查询数据库后返回的结果$result
$sql = "SELECT `id`,rate FROM `price_table`";
$query = $this->db->query($sql);
$result = $query->result_array();
if (is_array($result) && count($result, COUNT_NORMAL) > 0) {
return $result;
} else {
return false;
}
算法原理
以上文方法一:直接传 array 参数
传的参数举例:
1、定义奖品,记得加上未中奖的情况
奖品1 | 1 | 0.1 |
奖品2 | 2 | 0.234 |
奖品3 | 3 | 0 |
未中奖 | 4 | 0.6655 |
2、按照 rate (中奖概率)递增排序
奖品3 | 3 | 0 |
奖品1 | 1 | 0.1 |
奖品2 | 2 | 0.234 |
未中奖 | 4 | 0.6655 |
3、取出除 0 以外的最小 rate:min_rate
= 0.1,并计算每个奖品的权重值( weight )
奖品3 | 3 | 0 | 0 |
奖品1 | 1 | 0.1 | 1 |
奖品2 | 2 | 0.234 | 2.345 |
未中奖 | 4 | 0.6655 | 6.655 |
4、划分每个奖品的落点范围( range_min
, rang_max
],左开右闭
奖品3 | 3 | 0 | 0 | 0 | 0 |
奖品1 | 1 | 0.1 | 1 | 0 | 1 |
奖品2 | 2 | 0.234 | 2.345 | 1 | 3.345 |
未中奖 | 4 | 0.6655 | 6.655 | 3.345 | 10 |
5、找出落点范围小数点精确位数最多的奖品,并取出精确位数( max_float_length
)
奖品2 | 2 | 0.234 | 2.345 | 1 | 3.345 |
未中奖 | 4 | 0.6655 | 6.655 | 3.345 | 10 |
6、生成随机小数的落点
7、判断随机小数落在哪个奖品的范围