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中的stdClass类
Apr 18 PHP
国产PHP开发框架myqee新手快速入门教程
Jul 14 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
Oct 23 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
浅谈php自定义错误日志
Feb 13 PHP
PHP处理会话函数大总结
Aug 05 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
Sep 13 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
Oct 18 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
Oct 15 PHP
laravel自定义分页的实现案例offset()和limit()
Oct 15 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 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实现文件安全下载
2006/10/09 PHP
使用网络地址转换实现多服务器负载均衡
2006/10/09 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
PHP中Array相关函数简介
2016/07/03 PHP
PHP多进程编程实例详解
2017/07/19 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
JavaScript脚本性能优化注意事项
2008/11/18 Javascript
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
jquery.form.js用法之清空form的方法
2014/03/07 Javascript
JS实现控制表格内指定单元格内容对齐的方法
2015/03/30 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
浅谈JavaScript 覆盖原型以及更改原型
2016/08/31 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
Angular.js实现动态加载组件详解
2017/05/28 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
python使用tkinter实现简单计算器
2018/01/30 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
PyTorch加载预训练模型实例(pretrained)
2020/01/17 Python
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
机电专业毕业生求职信
2013/10/27 职场文书
国培教师自我鉴定
2014/02/12 职场文书
气象学专业个人求职信
2014/04/22 职场文书
青春励志演讲稿
2014/04/29 职场文书
会计简历自我评价
2015/03/10 职场文书
保研导师推荐信
2015/03/25 职场文书
公司停电通知
2015/04/15 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
2019年销售人员的职业生涯规划书
2019/03/25 职场文书
导游词之杭州西湖
2019/09/19 职场文书
python requests模块的使用示例
2021/04/07 Python
Python实现归一化算法详情
2022/03/18 Python
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫