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维护文件系统
Oct 09 PHP
用PHP查询搜索引擎排名位置的代码
Jan 05 PHP
PHP 第一节 php简介
Apr 28 PHP
php预定义变量使用帮助(带实例)
Oct 30 PHP
PHP+jQuery+Ajax实现用户登录与退出
Apr 27 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
Jun 22 PHP
实例讲解PHP中使用命名空间
Jan 27 PHP
php实现文章评论系统
Feb 18 PHP
php查询内存信息操作示例
May 09 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 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错误和异长常处理总结
2014/03/06 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
2015/08/27 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
js表头排序实现方法
2015/01/16 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
jQuery中slidedown与slideup方法用法示例
2016/09/16 Javascript
js面向对象编程总结
2017/02/16 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
EasyUI实现下拉框多选功能
2017/11/07 Javascript
详解tween.js 中文使用指南
2018/01/05 Javascript
vue-router 控制路由权限的实现
2020/09/24 Javascript
详解Typescript里的This的使用方法
2021/01/08 Javascript
python 中的列表解析和生成表达式
2011/03/10 Python
详解Python中的文件操作
2016/08/28 Python
Python机器学习之决策树算法
2017/12/22 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
环保倡议书100字
2014/05/15 职场文书
数学兴趣小组活动总结
2014/07/08 职场文书
2014年教师节寄语
2014/08/11 职场文书
给上级领导的感谢信
2015/01/22 职场文书
用电申请报告范文
2015/05/18 职场文书
车辆管理制度范本
2015/08/05 职场文书
JavaScript继承的三种方法实例
2021/05/12 Javascript
JavaScript实现班级抽签小程序
2021/05/19 Javascript