php抽奖概率算法(刮刮卡,大转盘)


Posted in PHP onApril 17, 2020

本文实例为大家分享了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); 
?>

想要学习更多关于抽奖功能的实现,请参考此专题:抽奖功能

以上就是php抽奖概率算法的全部内容,希望对大家学习php程序设计有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
在PHP中读取和写入WORD文档的代码
Apr 09 PHP
PHP 操作文件的一些FAQ总结
Feb 12 PHP
域名和cookie问题(域名后缀)
Oct 10 PHP
php查询whois信息的方法
Jun 08 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
yii分页组件用法实例分析
Dec 28 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 PHP
基于PHP实现等比压缩图片大小
Mar 04 PHP
Laravel实现自定义错误输出内容的方法
Oct 10 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
详解PHP PDO简单教程
May 28 PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 #PHP
[原创]php使用curl判断网页404(不存在)的方法
Jun 23 #PHP
PHP生成静态HTML文档实现代码
Jun 23 #PHP
PHP微信支付开发实例
Jun 22 #PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
Jun 22 #PHP
PHP树-不需要递归的实现方法
Jun 21 #PHP
PHP MySql增删改查的简单实例
Jun 21 #PHP
You might like
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
jqPlot Option配置对象详解
2009/07/25 Javascript
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
潜说js对象和数组
2011/05/25 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
2015/09/15 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
简单谈谈json跨域
2016/03/13 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
JavaScript基础之this详解
2017/06/04 Javascript
原生JS+Canvas实现五子棋游戏实例
2017/06/19 Javascript
p5.js入门教程之键盘交互
2018/03/19 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
Python读取网页内容的方法
2015/07/30 Python
Python基本语法经典教程
2016/03/11 Python
Python 序列的方法总结
2016/10/18 Python
人工智能最火编程语言 Python大战Java!
2017/11/13 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
python由已知数组快速生成新数组的方法
2020/04/08 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
2020/07/13 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
几个MySql的面试题
2013/04/22 面试题
会计电算化专业求职信
2014/06/10 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
贷款收入证明范本
2015/06/12 职场文书
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python
python超详细实现完整学生成绩管理系统
2022/03/17 Python