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数组函数序列之array_flip() 将数组键名与值对调
Nov 07 PHP
php的大小写敏感问题整理
Dec 29 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 PHP
php实现只保留mysql中最新1000条记录
Jun 18 PHP
php连接oracle数据库的核心步骤
May 26 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
PHP+ajax实现获取新闻数据简单示例
May 08 PHP
PHP ADODB实现事务处理功能示例
May 25 PHP
yii2 上传图片的示例代码
Nov 02 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 PHP
php提高脚本性能的4个技巧
Aug 18 PHP
PHP判断是否是json字符串
Apr 01 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
一家之言的经验之谈php+mysql扎实个人基本功
2008/03/27 PHP
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
PHP 获取 ping 时间的实现方法
2017/09/29 PHP
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
vue自定义指令实现v-tap插件
2016/11/03 Javascript
vuejs指令详解
2017/02/07 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
2017/05/20 jQuery
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
[01:06:19]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第二场 1月8日
2021/03/11 DOTA
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
在Django中创建URLconf相关的通用视图的方法
2015/07/20 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
如何获取Python简单for循环索引
2019/11/21 Python
python中p-value的实现方式
2019/12/16 Python
对Tensorflow中Device实例的生成和管理详解
2020/02/04 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
Numpy 多维数据数组的实现
2020/06/18 Python
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
幼儿园毕业寄语
2014/04/03 职场文书
班级体育活动总结
2014/07/05 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
专题民主生活会对照检查材料思想汇报
2014/09/29 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
因个人工作失误检讨书
2019/06/21 职场文书