文档章节

php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法

bengozhong
 bengozhong
发布于 2015/08/21 09:55
字数 663
阅读 69
收藏 9
    <?php  
    /*
     * 经典的概率算法,
     * $proArr是一个预先设置的数组,
     * 假设数组为:array(100,200,300,400),
     * 开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范围之内,  
     * 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,
     * 在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。
     * 这样 筛选到最终,总会有一个数满足要求。
     * 就相当于去一个箱子里摸东西,
     * 第一个不是,第二个不是,第三个还不是,那最后一个一定是。
     * 这个算法简单,而且效率非常 高,
     * 关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。
     */  
    function get_rand($proArr) {   
        $result = '';    
        //概率数组的总概率精度   
        $proSum = array_sum($proArr);    
        //概率数组循环   
        foreach ($proArr as $key => $proCur) {   
            $randNum = mt_rand(1, $proSum);   
            if ($randNum <= $proCur) {   
                $result = $key;   
                break;   
            } else {   
                $proSum -= $proCur;   
            }         
        }   
        unset ($proArr);    
        return $result;   
    }   
      
      
    /*
     * 奖项数组
     * 是一个二维数组,记录了所有本次抽奖的奖项信息,
     * 其中id表示中奖等级,prize表示奖品,v表示中奖概率。
     * 注意其中的v必须为整数,你可以将对应的 奖项的v设置成0,即意味着该奖项抽中的几率是0,
     * 数组中v的总和(基数),基数越大越能体现概率的准确性。
     * 本例中v的总和为100,那么平板电脑对应的 中奖概率就是1%,
     * 如果v的总和是10000,那中奖概率就是万分之一了。
     *  
     */  
    $prize_arr = array(   
        '0' => array('id'=>1,'prize'=>'平板电脑','v'=>1),   
        '1' => array('id'=>2,'prize'=>'数码相机','v'=>5),   
        '2' => array('id'=>3,'prize'=>'音箱设备','v'=>10),   
        '3' => array('id'=>4,'prize'=>'4G优盘','v'=>12),   
        '4' => array('id'=>5,'prize'=>'10Q币','v'=>22),   
        '5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),   
    );   
      
    /*
     * 每次前端页面的请求,PHP循环奖项设置数组,
     * 通过概率计算函数get_rand获取抽中的奖项id。
     * 将中奖奖品保存在数组$res['yes']中,
     * 而剩下的未中奖的信息保存在$res['no']中,
     * 最后输出json个数数据给前端页面。
     */  
    foreach ($prize_arr as $key => $val) {   
        $arr[$val['id']] = $val['v'];   
    }   
    $rid = get_rand($arr); //根据概率获取奖项id   
      
    $res['yes'] = $prize_arr[$rid-1]['prize']; //中奖项   
    unset($prize_arr[$rid-1]); //将中奖项从数组中剔除,剩下未中奖项   
    shuffle($prize_arr); //打乱数组顺序   
    for($i=0;$i<count($prize_arr);$i++){   
        $pr[] = $prize_arr[$i]['prize'];   
    }   
    $res['no'] = $pr;   
    print_r($res);   
    ?> 

© 著作权归作者所有

共有 人打赏支持
bengozhong
粉丝 17
博文 456
码字总数 464570
作品 0
深圳
程序员
私信 提问
幸运大转盘抽奖 抽奖算法 程序实现逻辑

幸运大转盘抽奖 抽奖算法 程序实现逻辑 近期碰到的一个需求,实现一个类似大转盘抽奖的功能,需自定义奖项,各奖项中奖概率,当日抽奖最大次数,抽奖成本等。分享一个简单的java代码的实现的...

DemonsI
09/29
0
0
幸运大转盘-jQuery+PHP实现的抽奖程序

目前好多网站上应用的转盘抽奖程序大多是基于flash的,而本文结合实例将使用jQuery和PHP来实现转盘抽奖程序,为了便于理解,作者分两部分来讲解,本文讲解第一部分,侧重使用jQuery实现转盘的...

蜗牛奔跑
2015/07/06
0
0
php几个常用的概率算法(抽奖、广告首选)

做网站类的有时会弄个活动什么的,来让用户参加,既吸引用户注册,又提高网站的用户活跃度。同时参加的用户会获得一定的奖品,有100%中奖的,也有按一定概率中奖的,大的比如中个ipad、iphon...

蜗牛奔跑
2015/07/22
0
0
透笔度/wx-jq

wx-jq (一套完全原创的微信小程序插件集合库) 微信小程序插件,微信小程序组件,微信小程序插件集合,微信小程序组件集合,微信小程序插件学习,微信小程序插件开发, 查看效果截图: http...

透笔度
01/26
0
0
Peason/jcbase-wx-song

微信项目部分截图: 大转盘抽奖项目 实现功能需求: 1、微信公众号里面增加一个抽奖及查看奖品的入口菜单。 2、奖品都是优惠券,有使用时间限制。 3、中奖概率100%。 4、可单独设置每个奖项的...

Peason
2016/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(6.1)hadoop生态圈介绍及就业前景

1. HADOOP背景介绍 1.1、什么是HADOOP 1.HADOOP是apache旗下的一套开源软件平台 2.HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 3.HADOOP的核心组...

em_aaron
19分钟前
0
0
hadoop垃圾回收站

在生产生,hdfs回收站必须是开启的,一般设置为7天。 fs.trash.interval 为垃圾回收站保留时间,如果为0则禁用回收站功能。 fs.trash.checkpoint.interval 回收站检查点时间,一般设置为小于...

hnairdb
昨天
1
0
腾讯与Github的魔幻会面背后的故事…

10月22日,腾讯开源管理办公室有幸邀请到Github新晋CEO Nat Friedman,前来鹅厂参观交流。目前腾讯已经有近70个项目在Github上开源,共获得17w stars,世界排名11位。Github是腾讯开源的主阵...

腾讯开源
昨天
1
0
单例模式

单例模式(Singleton pattern)属于创建型设计模式。 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对...

NinjaFrog
昨天
1
0
TypeScript基础入门之装饰器(三)

转载 TypeScript基础入门之装饰器(三) 继续上篇文章[TypeScript基础入门之装饰器(二)] 访问器装饰器 Accessor Decorator在访问器声明之前声明。 访问器装饰器应用于访问器的属性描述符,可用...

durban
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部