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版)
Oct 09 PHP
PHP&amp;MYSQL服务器配置说明
Oct 09 PHP
PHP数组内存耗用太多问题的解决方法
Apr 05 PHP
php 模拟POST|GET操作实现代码
Jul 20 PHP
php中设置index.php文件为只读的方法
Feb 06 PHP
php.ini修改php上传文件大小限制的方法详解
Jun 17 PHP
php5.3提示Function ereg() is deprecated Error问题解决方法
Nov 12 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
Feb 23 PHP
Laravel与CI框架中截取字符串函数
May 08 PHP
PHP接口并发测试的方法(推荐)
Dec 15 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP与以太坊交互详解
Aug 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中source #N问题的解决方法
2014/01/27 PHP
php数组去重复数据示例
2014/02/25 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
js 方法实现返回多个数据的代码
2009/04/30 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
jQuery实现新消息在网页标题闪烁提示
2015/06/23 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
关于JavaScript数组你所不知道的3件事
2016/08/24 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
2017/09/21 Javascript
详解在React里使用&quot;Vuex&quot;
2018/04/02 Javascript
layui点击按钮添加可编辑的一行方法
2018/08/15 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
2018/08/30 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
浅谈python中get pass用法
2019/03/19 Python
Python数据类型之List列表实例详解
2019/05/08 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
理工大学毕业生自荐信
2013/11/01 职场文书
《藤野先生》教学反思
2014/02/19 职场文书
六年级学生评语
2014/04/22 职场文书
入党积极分子党小组意见
2015/06/02 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
python opencv旋转图片的使用方法
2021/06/04 Python
Spring中的使用@Async异步调用方法
2021/11/01 Java/Android
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript