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
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
php中is_null,empty,isset,unset 的区别详细介绍
Apr 28 PHP
解析php安全性问题中的:Null 字符问题
Jun 21 PHP
php查看请求头信息获取远程图片大小的方法分享
Dec 25 PHP
php+js iframe实现上传头像界面无跳转
Apr 29 PHP
php结合md5实现的加密解密方法
Jan 25 PHP
PHP获取客户端及服务器端IP的封装类
Jul 21 PHP
php获取文件名称和扩展名的方法
Feb 07 PHP
PHP实现获取第一个中文首字母并进行排序的方法
May 09 PHP
PHP读取word文档的方法分析【基于COM组件】
Aug 01 PHP
php数组和链表的区别总结
Sep 20 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
业余方法DIY电子管FM收音机
2021/03/02 无线电
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
php查询及多条件查询
2017/02/26 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
PDO实现学生管理系统
2020/03/21 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
2010/05/13 Javascript
js中关于new Object时传参的一些细节分析
2011/03/13 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
2019/03/28 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
[00:57]辉夜杯战队访谈宣传片—VG
2015/12/25 DOTA
python下载图片实现方法(超简单)
2017/07/21 Python
python3下实现搜狗AI API的代码示例
2018/04/10 Python
Python *args和**kwargs用法实例解析
2020/03/02 Python
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
民事答辩状格式范文
2015/05/21 职场文书
我的1919观后感
2015/06/03 职场文书
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
Python+tkinter实现高清图片保存
2022/03/13 Python