zoukankan      html  css  js  c++  java
  • CodeIgniter-Lottery

    CodeIgniter-Lottery - php ci 抽奖辅助函数

    Github

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

    用法

    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,
        )
    );
    

    注:

    (1) id :奖品编号, rate:奖品中奖概率

    (2) id 从 1 开始递增

    (3) rate 为 [0,1]

    方法二:利用 $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、定义奖品,记得加上未中奖的情况

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

    2、按照 rate (中奖概率)递增排序

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

    3、取出除 0 以外的最小 rate:min_rate = 0.1,并计算每个奖品的权重值( weight )

    权重值计算公式:weight = rate / min_rate

    type id rate 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 ],左开右闭

    落点范围:

    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

    5、找出落点范围小数点精确位数最多的奖品,并取出精确位数( 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

    6、生成随机小数的落点

    随机小数范围 = rand(1 , max(range_max) * pow(10, max_float_length)) / pow(10, max_float_length)

    7、判断随机小数落在哪个奖品的范围

    若随机小数 = 2.175 ,即落在奖品2

  • 相关阅读:
    文字超出省略号表示的几种方法
    Sqlserver数据库死锁
    Session丢失原因与解决方案
    CLR Profiler 性能分析工具 (转)
    微软HoloLens虚拟现实可以开发了。
    数据表分区
    SQLSERVER内核架构剖析 (转)
    理解SQL SERVER中的分区表(转)
    SQL Server Profile:使用方法和指标说明
    监视剪贴板(转)
  • 原文地址:https://www.cnblogs.com/xjnotxj/p/6193973.html
Copyright © 2011-2022 走看看