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调用mysql存储过程
Feb 14 PHP
php 模拟POST|GET操作实现代码
Jul 20 PHP
基于MySQL分区性能的详细介绍
May 02 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
May 06 PHP
PHP中4种常用的抓取网络数据方法
Jun 04 PHP
10个php函数实用却不常见
Oct 13 PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 PHP
Symfony2安装的方法(2种方法)
Feb 04 PHP
Zend Framework缓存Cache用法简单实例
Mar 19 PHP
php时间戳转换代码详解
Aug 04 PHP
为你的 Laravel 验证器加上多验证场景的实现
Apr 07 PHP
PHP7 其他语言层面的修改
Mar 09 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安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
发现的以前不知道的函数
2006/09/19 Javascript
QUnit jQuery的TDD框架
2010/11/04 Javascript
浅谈javascript 函数表达式和函数声明的区别
2016/01/05 Javascript
Vue.js原理分析之observer模块详解
2017/02/17 Javascript
Vue2.0生命周期的理解
2018/08/20 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
jquery实现掷骰子小游戏
2019/10/24 jQuery
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
python用来获得图片exif信息的库实例分析
2015/03/16 Python
Python使用爬虫猜密码
2016/02/19 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
python requests指定出口ip的例子
2019/07/25 Python
python 写一个性能测试工具(一)
2020/10/24 Python
pytorch简介
2020/11/11 Python
DataList 能否分页,请问如何实现?
2015/05/03 面试题
结婚喜宴家长答谢词
2014/01/15 职场文书
日化店促销方案
2014/03/26 职场文书
医药销售自荐书
2014/05/29 职场文书
社会实践的活动方案
2014/08/22 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
安全检查汇报材料
2014/12/26 职场文书
2015世界地球日活动总结
2015/02/09 职场文书
2015中秋祝酒词
2015/08/12 职场文书
Mysql开启外网访问
2022/05/15 MySQL