CodeIgniter-Lottery - php ci 抽獎輔助函數

CodeIgniter-Lottery - php ci 抽獎輔助函數

Github

https://github.com/xjnotxj/CodeIgniter-Lotteryphp

用法

一、 移入文件

lottery_helper.php放在你的工程根目錄/application/helpers/git

二、導入輔助函數

$this->load->helper('lottery');

三、調用

//抽獎,返回獎品id
$price_id = lottery($arr);

echo $price_id;

關於$arr參數的規範有下面兩種方式:github

方法一:直接傳 array 參數
$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

二、按照 rate (中獎機率)遞增排序

type id rate
獎品3 3 0
獎品1 1 0.1
獎品2 2 0.234
未中獎 4 0.6655

三、取出除 0 之外的最小 rate: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

相關文章
相關標籤/搜索