将lottery_helper.php
放在你的工程根目录/application/helpers/git
$this->load->helper('lottery');
//抽奖,返回奖品id $price_id = lottery($arr); echo $price_id;
关于$arr
参数的规范有下面两种方式:github
$arr = array( array( "id" => 1, "rate" => 0.1, ), array( "id" => 2, "rate" => 0.2345, ), array( "id" => 3, "rate" => 0, ) );
注:算法
(1) id :奖品编号, rate:奖品中奖几率sql
(2) id 从 1 开始递增数据库
(3) rate 为 [0,1]app
$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 参数
传的参数举例:函数
type | id | rate |
---|---|---|
奖品1 | 1 | 0.1 |
奖品2 | 2 | 0.234 |
奖品3 | 3 | 0 |
未中奖 | 4 | 0.6655 |
type | id | rate |
---|---|---|
奖品3 | 3 | 0 |
奖品1 | 1 | 0.1 |
奖品2 | 2 | 0.234 |
未中奖 | 4 | 0.6655 |
min_rate
= 0.1,并计算每一个奖品的权重值( weight )权重值计算公式:weight = rate / min_ratecodeigniter
type | id | rate | weight |
---|---|---|---|
奖品3 | 3 | 0 | 0 |
奖品1 | 1 | 0.1 | 1 |
奖品2 | 2 | 0.234 | 2.345 |
未中奖 | 4 | 0.6655 | 6.655 |
range_min
, rang_max
],左开右闭落点范围:this
range_min = 上个奖品的 range_max
range_max = range_min + weight
type | id | rate | weight | 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 |
max_float_length
)type | id | rate | weight | range_min | rang_max |
---|---|---|---|---|---|
奖品2 | 2 | 0.234 | 2.345 | 1 | 3.345 |
未中奖 | 4 | 0.6655 | 6.655 | 3.345 | 10 |
max_float_length = 3.345,即精确位数为小数点后 3 位
随机小数范围 = rand(1 , max(range_max) * pow(10, max_float_length)) / pow(10, max_float_length)
若随机小数 = 2.175 ,即落在奖品2!