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


Posted in PHP onMay 14, 2015

们先完成后台PHP的流程,PHP的主要工作是负责配置奖项及对应的中奖概率,当前端页面点击翻动某个方块时会想后台PHP发送ajax请求,那么后台PHP根据配置的概率,通过概率算法给出中奖结果,同时将未中奖的奖项信息一并以JSON数据格式发送给前端页面。

先来看概率计算函数

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; 
}

上述代码是一段经典的概率算法,$proArr是一个预先设置的数组,假设数组为:array(100,200,300,400),开始是从1,1000这个概率范围内筛选第一个数是否在他的出现概率范围之内, 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。这样筛选到最终,总会有一个数满足要求。就相当于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个一定是。这个算法简单,而且效率非常高,关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。

接下来我们通过PHP配置奖项。

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

该二维数组,记录了所有本次抽奖的奖项信息,其中id表示中奖等级,prize表示奖品,v表示中奖概率。注意其中的v必须为整数,你可以将对应的奖项的v设置成0,即意味着该奖项抽中的几率是0,数组中v的总和(基数),基数越大越能体现概率的准确性。本例中v的总和为100,那么平板电脑对应的中奖概率就是1%,如果v的总和是10000,那中奖概率就是万分之一了。

每次前端页面的请求,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; 
 echo json_encode($res);

另附上一个网友的实现方法

/**
  * 抽奖
  * @param int $total
  */
  function getReward($total=1000)
  {
  $win1 = floor((0.12*$total)/100);
  $win2 = floor((3*$total)/100);
  $win3 = floor((12*$total)/100);
  $other = $total-$win1-$win2-$win3;
  $return = array();
  for ($i=0;$i<$win1;$i++)
  {
  $return[] = 1;
  }
  for ($j=0;$j<$win2;$j++)
  {
  $return[] = 2;
  }
  for ($m=0;$m<$win3;$m++)
  {
  $return[] = 3;
  }
  for ($n=0;$n<$other;$n++)
  {
  $return[] = '谢谢惠顾';
  }
  shuffle($return);
  return $return[array_rand($return)];
  }
  $data = getReward();
  echo $data;
  ?>

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
实现“上一页”和“下一页按钮
Oct 09 PHP
Access数据库导入Mysql的方法之一
Oct 09 PHP
php 修改zen-cart下单和付款流程以防止漏单
Mar 08 PHP
解析PHP中empty is_null和isset的测试
Jun 29 PHP
PHP时间戳 strtotime()使用方法和技巧
Oct 29 PHP
php阻止页面后退的方法分享
Feb 17 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
php限制文件下载速度的代码
Oct 20 PHP
CodeIgniter基于Email类发邮件的方法
Mar 29 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 PHP
PHP实现统计代码行数小工具
Sep 19 PHP
深入浅出php socket编程
May 13 #PHP
PHP中的traits简单使用实例
May 13 #PHP
PHP中的traits实现代码复用使用实例
May 13 #PHP
浅谈本地WAMP环境的搭建
May 13 #PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
May 13 #PHP
简单解决新浪SAE无法上传文件的问题
May 13 #PHP
PHP file_get_contents函数读取远程数据超时的解决方法
May 13 #PHP
You might like
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
js加解密 脚本解密
2008/02/22 Javascript
jquery购物车实时结算特效实现思路
2013/09/23 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
jQuery实现摸拟alert提示框
2016/05/22 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
layui分页效果实现代码
2017/05/19 Javascript
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
Vue 子组件与数据传递问题及注意事项
2019/07/11 Javascript
Vue 中 a标签上href无法跳转的解决方式
2019/11/12 Javascript
通过javascript实现扫雷游戏代码实例
2020/02/09 Javascript
jquery向后台提交数组的代码分析
2020/02/20 jQuery
[52:31]VP vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
解决django 向mysql中写入中文字符出错的问题
2020/05/18 Python
Python Map 函数的使用
2020/08/28 Python
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
软件配置管理有什么好处
2015/04/15 面试题
写给老师的表扬信
2014/01/21 职场文书
大学校庆策划书
2014/01/31 职场文书
房屋租赁协议书(标准版)
2014/10/02 职场文书
大学生操行评语大全
2014/12/31 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
bose降噪耳机音能消除人声吗
2022/04/19 数码科技