基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法


Posted in PHP onDecember 20, 2015

大转盘中奖概率算法在我们的日常生活中,经常遇到,那么基于php代码是如何实现中奖概率算法的,下面通过一段代码实例给大家介绍php中奖概率算法,代码简单易懂,并且附有注释,具体代码如下所示:

<?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);

下面再给大家分享一段实例代码基于Java实现中奖概率计算

 做移动的项目,有个需求,做个摇奖的活动!其中中奖的计算比较恶心,用户要改动各个奖项的中奖概率,而且每天的奖项有个数限制。一二三四五六等奖,概率不通,怎么算一个用户参与了中没中将呢?苦思了一下,可以用Random类的 nextInt(int x)方法产生一个范围内的随机数,产生到那个区间就是几等奖了,中奖区间的产生是动态的。贴出源代码,仅供参考!

package Mzone;
import java.util.ArrayList;
import java.util.Random;
public class Mzone {
 /**
 * CopyRright(c)2009-04: 
 * Project: 
 * Module ID: 
 * Comments: 概率计算
 * JDK version used: <JDK1.4>
 * Author:ch
 * Create Date:2009-04-20
 * Modified By: 
 * Modified Date: 
 * Why & What is modified 
 * Version: 1.0
 */ 
 static Random r = new Random();
 public static void main(String[] args) {
  //各个奖项的中奖概率的分母
  Integer _5m = new Integer(5);
  Integer _500m = new Integer(30);
  Integer _ipod = new Integer(500);
  Integer _phone = new Integer(1000);
  Integer _notebook = new Integer(1500);
  Integer _jay = new Integer(50);
  ArrayList list = new ArrayList();
  if(_5m.intValue()!=0)
   list.add(_5m);
  if(_500m.intValue()!=0)
   list.add(_500m);
  if(_ipod.intValue()!=0)
   list.add(_ipod);
  if(_phone.intValue()!=0)
   list.add(_phone);
  if(_notebook.intValue()!=0)
   list.add(_notebook);
  if(_jay.intValue()!=0)
   list.add(_jay);
  //计算最小公倍数
  int common = getN(list);
  System.out.println("最小公倍数:"+common);
  int a = 0;int b = 0;int c = 0;int d = 0;int e = 0;int f = 0;int g = 0;
  int first = 0;int second = 0;int third = 0;int four = 0;int fifth = 0;int sixth = 0;
  if(_5m.intValue()!=0){
   first = common/_5m.intValue();
  }
  if(_500m.intValue()!=0){
   second = first + (common/_500m.intValue());
  }else second = first;
  if(_ipod.intValue()!=0){
   third = second + (common/_ipod.intValue());
  }else third = second;
  if(_phone.intValue()!=0){
   four = third + (common/_phone.intValue());
  }else four = third;
  if(_notebook.intValue()!=0){
   fifth = four + (common/_notebook.intValue());
  }else fifth = four;
  if(_jay.intValue()!=0){
   sixth = fifth + (common/_jay.intValue());
  }else sixth = fifth;
  int times = 30000;//循环次数
  for(int i = 0;i < times; i++){
   int ri = getRandom(common);//产生随机数
   if(ri >= 0 && ri < first){
    a++;
   }else if(ri >= first && ri < second){
    b++;
   }else if(ri >= second && ri < third){
    c++;
   }else if(ri >= third && ri < four){
    d++;
   }else if(ri >= four && ri < fifth){
    e++;
   }else if(ri >= fifth && ri < sixth){
    f++;
   }else{
    g++;
   }
  }
  System.out.println("5m值:" + a + " 500m值:" + b + " ipodMP3:" + c + " 手机:" + d + " 笔记本电脑:" + e + " 演唱会门票:" + f + " 谢谢参与:" + g);
 }
 /**
  * 求最大公约数
 */
 public static int gcd(int m, int n){
  while (true){
   if ((m = m % n) == 0)
   return n;
   if ((n = n % m) == 0)
   return m;
  }
 }
 /**
 * 求最小公倍数
 */
 public static int gys(int z, int y){
  int t = 0;
  int c = 0;
  c = gcd(z,y);
  t = z * y / c;
  return t;
 }
 /**
  * 求几个数的最小公倍数
 */
 public static int getN(ArrayList list){
  int t = 1;
  for(int i = 0;i<list.size();i++){
   Integer temp = (Integer)list.get(i);
   t = gys(t,temp.intValue());
  }
  return t; 
 }
 /**
  * 产生随机数
 */
 public static int getRandom(int y){
  int result = r.nextInt(y);
  return result;
 }
}
PHP 相关文章推荐
PHP与MySQL交互使用详解
Oct 09 PHP
AJAX for PHP简单表数据查询实例
Jan 02 PHP
MySQL授权问题总结
May 06 PHP
使用XDebug调试及单元测试覆盖率分析
Jan 27 PHP
解析CI的AJAX分页 另类实现方法
Jun 27 PHP
php获取淘宝分类id示例
Jan 16 PHP
php更新mysql后获取改变行数的方法
Dec 25 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
简单谈谈PHP vs Node.js
Jul 17 PHP
PHP实现的自定义数组排序函数与排序类示例
Nov 18 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
May 25 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
Dec 19 #PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
Dec 19 #PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
Dec 19 #PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
Dec 19 #PHP
PHP程序中使用adodb连接不同数据库的代码实例
Dec 19 #PHP
php实现面包屑导航例子分享
Dec 19 #PHP
php实现倒计时效果
Dec 19 #PHP
You might like
PHP详细彻底学习Smarty
2008/03/27 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
JS实现文档加载完成后执行代码
2015/07/09 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
2016/05/12 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
nginx配置React静态页面的方法教程
2017/11/03 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
python中sys.argv函数精简概括
2018/07/08 Python
python dlib人脸识别代码实例
2019/04/04 Python
Python for循环及基础用法详解
2019/11/08 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
浅谈CSS3特性查询(Feature Query: @supports)功能简介
2017/07/31 HTML / CSS
阿迪达斯芬兰官方网站:adidas芬兰
2017/01/30 全球购物
全球最大的游戏市场:G2A
2018/07/05 全球购物
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
.NET面试题:什么是反射
2016/09/30 面试题
网络方面基础面试题
2012/11/16 面试题
面试自我介绍演讲稿
2014/04/29 职场文书
机器人瓦力观后感
2015/06/12 职场文书
公文写作:新员工转正申请书范本3篇!
2019/08/07 职场文书
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS