<?php
 //中奖概率算法(php 可用于刮刮卡,大转盘等抽奖算法)
 /*
 * 经典的概率算法,
 * $proArr是一个预先设置的数组,
 * 假设数组为:array(100,200,300,400),
 * 开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范围之内,
 * 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,
 * 在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。
 * 这样 筛选到最终,总会有一个数满足要求。
 * 就相当于去一个箱子里摸东西,
 * 第一个不是,第二个不是,第三个还不是,那最后一个一定是。
 * 这个算法简单,而且效率非常 高,
 * 关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。
 */
 date_default_timezone_set("PRC");
 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;
 }

 /**
  * @return mixed
  * 获取抽奖信息
  */
 function get_prize_info(){
     /*
     * 奖项数组
     * 是一个二维数组,记录了所有本次抽奖的奖项信息,
     * 其中id表示中奖等级,prize表示奖品,v表示中奖概率。
     * 注意其中的v必须为整数,你可以将对应的 奖项的v设置成0,即意味着该奖项抽中的几率是0,
     * 数组中v的总和(基数),基数越大越能体现概率的准确性。
     * 本例中v的总和为100,那么平板电脑对应的 中奖概率就是1%,
     * 如果v的总和是10000,那中奖概率就是万分之一了。
     *
     */
     $prize_arr = array(
         '0' => array('id'=>1,'prize'=>'平板电脑','v'=>0),//0概率
         '1' => array('id'=>2,'prize'=>'数码相机','v'=>0),//0概率
         '2' => array('id'=>3,'prize'=>'音箱设备','v'=>0),//0概率
         '3' => array('id'=>4,'prize'=>'4G优盘','v'=>10),//0.01%的概率
         '4' => array('id'=>5,'prize'=>'10Q币','v'=>5),//0.005%的概率
         '5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>99985),//99.985%的概率
     );

     /*
     * 每次前端页面的请求,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;
     return $res;
 }

 //模拟请求了10万次抽奖
 echo date("Y-m-d H:i:s")."<br/>";
 for($j=1;$j<=100000;$j++){
     usleep(200000);
     $datas=get_prize_info();
     file_put_contents('/www/5.txt', var_export($datas,true),FILE_APPEND);
 }
 echo date("Y-m-d H:i:s")."<br/>";
 //Cli模式下运行,或使用多进程

中奖概率算法(php 可用于刮刮卡,大转盘等抽奖算法)的更多相关文章

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

    php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法.用法很简单,代码里有详细注释说明,一看就懂 <?php /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为: ...

  2. 高处胜寒 php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法

    <?php /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为:array(100,200,300,400), * 开始是从1,1000 这个概率范围内筛选第一 ...

  3. paip.刮刮卡砸金蛋抽奖概率算法跟核心流程.

    paip.刮刮卡砸金蛋抽奖概率算法跟核心流程. #---抽奖算法需要满足的需求如下: 1 #---抽奖核心流程 1 #---问题???更好的算法 2 #---实际使用的扩展抽奖算法(带奖品送完判断和每 ...

  4. php编写的抽奖程序中奖概率算法

    本文给大家分享的是php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法.用法很简单,代码里有详细注释说明,一看就懂,有需要的小伙伴参考下吧. 我们先完成后台PHP的流程,PHP的主要工作是负责配置奖项及 ...

  5. php获胜的算法的概率,它可用于刮,大转盘等彩票的算法

    php获胜的算法的概率,它可用于刮,大转盘等彩票的算法. easy,代码里有具体凝视说明.一看就懂 <?php /* * 经典的概率算法, * $proArr是一个预先设置的数组. * 假设数组 ...

  6. 【Android - 自定义View】之自定义View实现“刮刮卡”效果

    首先来介绍一下这个自定义View: (1)这个自定义View的名字叫做 GuaguakaView ,继承自View类: (2)这个View实现了很多电商项目中的“刮刮卡”的效果,即用户可以刮开覆盖层, ...

  7. Html5实现移动端、PC端 刮刮卡效果

    刚从南方回来就分了一个刮刮卡效果的页面,特么的我在烦恼怎么用H5去实现这个效果呢,好不容易写出来了,产品居然说:“既然你可以写出来这个效果那当然好了,开始我只是打算让你实现点击就出现呢!”… … 尼玛 ...

  8. 用c#开发微信 (16) 微活动 2 刮刮卡

    微信营销是一种新型的营销模式,由于微信更重视用户之间的互动,故而这种营销推广不不能盲目地套用微博营销的单纯大量广告推送方式.这种方式在微信营销中的效果非常差,会令用户反感,继而取消去企业或商家的微信公 ...

  9. 使用HTML5实现刮刮卡效果

    你玩过刮刮卡么?一不小心可以中奖的那种.今天我给大家分享一个基于HTML5技术实现的刮刮卡效果,在PC上只需按住鼠标,在手机上你只需按住指头,轻轻刮去图层就可以模拟真实的刮奖效果. 我们利用HTML5 ...

随机推荐

  1. JS对select动态添加option操作 (三级联动) (搜索拼接)

    以下纯属自我理解之下再东搜西查的内容~ JS对select动态添加option操作有个高大上的艺名叫多级联动:第一级改变时,第二级跟着变,第二级改变时,第三级跟着变... 本菜鸟是在工作中遇到做收货地 ...

  2. Linux 按时间批量删除文件(删除N天前文件)

    需要根据时间删除这个目录下的文件,/home/lifeccp/dicom/studies,清理掉20天之前的无效数据. 可以使用下面一条命令去完成: -name "*.*" -ex ...

  3. 腾讯IVWEB团队:前端 fetch 通信

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:villainthr 文章摘自: 前端小吉米 随着前端异步的发展, XHR 这种耦合方式的书写不利于前端 ...

  4. 自己写的书《深入理解Android虚拟机内存管理》,不出版只是写着玩

    百度网盘地址:https://pan.baidu.com/s/1jI4xZgE 我给起的书名叫做<深入理解Android虚拟机内存管理>.本书分为两个部分,前半部分主要是我对Linux0. ...

  5. 分享几个日常调试方法让js调试更简单

    下面分享几个日常调试代码的时候在Console命令行显示你的操作,让你的js调试更简单. console显示信息的命令 在浏览器按f12在console上显示你的文本. <!DOCTYPE ht ...

  6. Vue常用经典开源项目汇总参考-海量

    Vue常用经典开源项目汇总参考-海量 Vue是什么? Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的 ...

  7. 实时语音视频技术webrtc的编译总结

    webrtc编译教程 一.安装depot_tools工具 首先你的电脑上安装了git 1)    下载depot_tools cd到下载的目录下 git clone https://chromium. ...

  8. SmartCoder每日站立会议04

    1.站立会议内容 经过今天的站立会议,决定首页先做成简单的样式,先完善功能.进行了首页模块划分. 站立会议照片: 2.任务展板    3.燃尽图    

  9. python爬虫从入门到放弃(六)之 BeautifulSoup库的使用

    上一篇文章的正则,其实对很多人来说用起来是不方便的,加上需要记很多规则,所以用起来不是特别熟练,而这节我们提到的beautifulsoup就是一个非常强大的工具,爬虫利器. beautifulSoup ...

  10. C# Ajax 返回json数据--前后台交互

    本人实习生一枚,遇到这个问题,网上找的试了试基本可以,自己搞了一下.可以供新手参考,大神如有指点,请不吝赐教. 版权声明:本文为博主原创文章,未经博主允许不得转载. 前台JavaScript代码: & ...