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 相关文章推荐
php 文件上传代码(限制jpg文件)
Jan 05 PHP
PHP中改变图片的尺寸大小的代码
Jul 17 PHP
记录PHP错误日志 display_errors与log_errors的区别
Oct 09 PHP
php 根据url自动生成缩略图并处理高并发问题
Jan 23 PHP
php学习笔记之面向对象
Nov 08 PHP
PHP批量去除BOM头代码分享
Jun 26 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
Jan 11 PHP
php开发时容易忘记的一些技术细节
Feb 03 PHP
php的api数据接口书写实例(推荐)
Sep 22 PHP
php出租房数据管理及搜索页面
May 23 PHP
解决laravel session失效的问题
Oct 14 PHP
php 使用expat方式解析xml文件操作示例
Nov 26 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
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
解析php类的注册与自动加载
2013/07/05 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
2015/01/22 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
PHP调用接口API封装的例子
2019/10/11 PHP
JS拖动技术 关于setCapture使用
2010/12/09 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
vue中的使用token的方法示例
2020/03/10 Javascript
vue项目中使用bpmn为节点添加颜色的方法
2020/04/30 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
Python实现文件复制删除
2016/04/19 Python
Python编写简单的HTML页面合并脚本
2016/07/11 Python
详解Python装饰器由浅入深
2016/12/09 Python
python梯度下降法的简单示例
2018/08/31 Python
Python Django Vue 项目创建过程详解
2019/07/29 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
通过实例解析Python return运行原理
2020/03/04 Python
python中元组的用法整理
2020/06/15 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
董事长职责范文
2013/11/08 职场文书
工程部主管岗位职责
2013/11/17 职场文书
客户接待方案
2014/02/26 职场文书
市政管理求职信范文
2014/05/07 职场文书
个人求职自荐信范文
2015/03/06 职场文书
主持稿开场白
2015/06/01 职场文书
室外天线与收音机天线杆接合方法
2022/04/05 无线电