php实现自定义中奖项数和概率的抽奖函数示例


Posted in PHP onMay 26, 2017

本文实例讲述了php实现自定义中奖项数和概率的抽奖函数。分享给大家供大家参考,具体如下:

<?php
/*
* 一个抽奖类,精确到万分之一
* 三个步骤:1.接受一个中奖概率数组;2.接受一个抽奖种子;3.返回中奖等级
*/
class Lottery {
/*
* 中奖概率数组,自动判断奖项数目
* 数组键值和为100,自动计算出不中奖的概率,若初始是超过100抛出一个错误
*/
protected $_rate = array();
/*
* 设置中奖概率,
* @param Array,中奖概率,以数组形式传入
*/
public function setRate($rate = array(12.1, 34)) {
$this->_rate = $rate;
if (array_sum($this->_rate) > 100)//检测概率设置是否有问题
throw new Exception('Winning rate upto 100%');
if (array_sum($this->_rate) < 100)
//定义未中奖情况的概率,用户给的概率只和为100时,则忽略0
$this->_rate[] = 100 - array_sum($this->_rate);
}
/*
* 随机生成一个1-10000的整数种子,提交给中奖判断函数
* @return int,按传入的概率排序,返回中奖的项数
*/
public function runOnce() {
return $this->judge(mt_rand(0, 10000));
}
/*
* 按所设置的概率,判断一个传入的随机值是否中奖
* @param int,$seed 10000以内的随机数
* @return int,$i 按传入的概率排序,返回中奖的项数
*/
protected function judge($seed) {
foreach ($this->_rate as $key => $value) {
$tmpArr[$key + 1] = $value * 100;
}
//将概率乘十后累计,以便随机选择,组合成
$tmpArr[0] = 0;
foreach ($tmpArr as $key => $value) {
if ($key > 0) {
$tmpArr[$key] += $tmpArr[$key - 1];
}
}
for ($i = 1; $i < count($tmpArr); $i++) {
if ($tmpArr[$i - 1] < $seed && $seed <= $tmpArr[$i]) {
return $i; //返回中奖的项数(按概率的设置顺序)
}
}
}
}
$rate = array(33, 20, 2, 0.95, 12, 4.55);
$a = new Lottery;
$a->setRate($rate);
for ($i = 0; $i <= 10000; $i++) {
$b = $a->runOnce();
@$rewards[$b]++;
}
unset($rewards['']);
echo array_sum($rewards);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
</head>
<body>
<table>
<thead>运行10000次,对比设置概率和中奖次数</thead>
<tr><th>设置概率</th><th>中奖次数</th></tr>
<tr><td><?php echo $rate[0]; ?>%</td><td><?php echo $rewards[1] ?></td></tr>
<tr><td><?php echo $rate[1]; ?>%</td><td><?php echo $rewards[2] ?></td></tr>
<tr><td><?php echo $rate[2]; ?>%</td><td><?php echo $rewards[3] ?></td></tr>
<tr><td><?php echo $rate[3]; ?>%</td><td><?php echo $rewards[4] ?></td></tr>
<tr><td><?php echo $rate[4]; ?>%</td><td><?php echo $rewards[5] ?></td></tr>
<tr><td><?php echo $rate[5]; ?>%</td><td><?php echo $rewards[6] ?></td></tr>
<tr><td><?php echo 'miss'; ?></td><td><?php echo $rewards[7] ?></td></tr>
</table>
</body>
</html>
PHP 相关文章推荐
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
Nov 27 PHP
Fatal error: Call to undefined function curl_init()解决方法
Apr 09 PHP
php 过滤器实现代码
Aug 09 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
Oct 29 PHP
php 获取百度的热词数据的代码
Feb 18 PHP
php中的mongodb select常用操作代码示例
Sep 06 PHP
php文件上传的两种实现方法
Apr 04 PHP
PHP的中使用非缓冲模式查询数据库的方法
Feb 05 PHP
PHP实现的简单AES加密解密算法实例
May 29 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
laravel 5.4中实现无限级分类的方法示例
Jul 27 PHP
PHP实现的操作数组类库定义与用法示例
May 24 PHP
PHP判断密码强度的方法详解
May 26 #PHP
thinkphp实现附件上传功能
May 26 #PHP
微信第三方登录(原生)demo【必看篇】
May 26 #PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
May 26 #PHP
老生常谈PHP面向对象之注册表模式
May 26 #PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 #PHP
Yii框架实现多数据库配置和操作的方法
May 25 #PHP
You might like
php array_filter除去数组中的空字符元素
2020/06/21 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
javascript 写类方式之四
2009/07/05 Javascript
IE6下opacity与JQuery的奇妙结合
2013/03/01 Javascript
jQuery侧边栏随窗口滚动实现方法
2013/03/04 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
jQuery自定义插件详解及实例代码
2016/12/29 Javascript
JS实现百度网盘任意文件强制下载功能
2018/08/31 Javascript
微信小程序仿今日头条导航栏滚动解析
2019/08/20 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
微信小程序wxs实现吸顶效果
2020/01/08 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
Python自定义线程池实现方法分析
2018/02/07 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
学习Python爬虫的几点建议
2020/08/05 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
工程业务员工作职责
2013/12/07 职场文书
运动会入场词100字
2014/02/06 职场文书
学生会部长竞聘书
2014/03/31 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
单位委托书范本(3篇)
2014/09/18 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书
nginx配置限速限流基于内置模块
2022/05/02 Servers
python三子棋游戏
2022/05/04 Python
深入理解pytorch库的dockerfile
2022/06/10 Python