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和数据库结合的一个简单的web实例 代码分析 (php初学者)
Jul 28 PHP
PHP爆绝对路径方法收集整理
Sep 17 PHP
php教程 插件机制在PHP中实现方案
Nov 02 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
Jun 25 PHP
一个简单且很好用的php分页类
Oct 26 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
Dec 08 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
PHP多进程简单实例小结
Nov 09 PHP
thinkphp5实现微信扫码支付
Dec 23 PHP
php7 图形用户界面GUI 开发示例
Feb 22 PHP
php7 错误处理机制修改实例分析
May 25 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 ajax 静态分页过程形式
2011/09/02 PHP
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
ThinkPHP页面跳转success与error方法概述
2014/06/25 PHP
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
使用PHP如何实现高效安全的ftp服务器(二)
2015/12/30 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
PHP让网站移动访问更加友好方法
2019/02/14 PHP
基于jquery打造的百分比动态色彩条插件
2012/09/19 Javascript
javascript中如何处理引号编码&amp;#034;
2013/08/15 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
实例分析nodejs模块xml2js解析xml过程中遇到的坑
2017/03/18 NodeJs
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
2018/03/15 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
python使用pil生成图片验证码的方法
2015/05/08 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
python的concat等多种用法详解
2018/11/28 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
python pandas利用fillna方法实现部分自动填充功能
2020/03/16 Python
Python使用Pygame绘制时钟
2020/11/29 Python
基于HTML5+Webkit实现树叶飘落动画
2017/12/28 HTML / CSS
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
小学数学教学反思
2014/02/02 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
靠谱准确的求职信
2019/04/02 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript
如何利用python创作字符画
2022/06/25 Python