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 相关文章推荐
第十二节--类的自动加载
Nov 16 PHP
PHP音乐采集(部分代码)
Feb 14 PHP
对squid中refresh_pattern的一些理解和建议
Apr 17 PHP
PHP的PSR规范中文版
Sep 28 PHP
php stripslashes和addslashes的区别
Feb 03 PHP
浅析THINKPHP的addAll支持的最大数据量
Feb 03 PHP
php中将一个对象保存到Session中的方法
Mar 13 PHP
php检查是否是ajax请求的方法
Apr 16 PHP
PHP模板解析类实例
Jul 09 PHP
PHP目录操作实例总结
Sep 27 PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 PHP
laravel实现上传图片并在页面显示的例子
Oct 14 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框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
尽可能写&quot;友好&quot;的&quot;Javascript&quot;代码
2007/01/09 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
javascript数组详解
2014/10/22 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
JavaScript中文件上传API详解
2016/04/01 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
用JavaScript做简易的购物车的代码示例
2017/10/20 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
python使用socket连接远程服务器的方法
2015/04/29 Python
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
python中 logging的使用详解
2017/10/25 Python
解决python给列表里添加字典时被最后一个覆盖的问题
2019/01/21 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
基于Jquery和Css3代码制作可以缩放的搜索框
2015/11/19 HTML / CSS
家庭睡衣和家庭用品:Little Blue House
2018/03/18 全球购物
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
Clarks西班牙官方在线商店:clarks鞋
2019/05/03 全球购物
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
工会主席岗位责任制
2014/02/11 职场文书
买卖协议书范本
2014/04/21 职场文书
博士生求职信
2014/07/06 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
Python 用户输入和while循环的操作
2021/05/23 Python
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
MySQL快速插入一亿测试数据
2021/06/23 MySQL
python数字图像处理:图像简单滤波
2022/06/28 Python