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执行速度全攻略
Oct 09 PHP
在任意字符集下正常显示网页的方法一
Apr 01 PHP
php preg_match_all结合str_replace替换内容中所有img
Oct 11 PHP
smarty的保留变量问题
Oct 23 PHP
支持中文、字母、数字的PHP验证码
May 04 PHP
PHP基本语法实例总结
Sep 09 PHP
php获取给定日期相差天数的方法分析
Feb 20 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
laravel5实现微信第三方登录功能
Dec 06 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
Dec 30 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.NET的入门教程
2006/10/09 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
javascript中数组的concat()方法使用介绍
2013/12/18 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
webpack4 css打包压缩问题的解决
2018/05/18 Javascript
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
2018/08/08 Javascript
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
Node.js 深度调试方法解析
2020/07/28 Javascript
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
银河香水:Galaxy Perfume
2019/03/25 全球购物
P/Invoke是什么
2015/07/31 面试题
大学自主招生自荐信范文
2014/02/26 职场文书
普通话演讲稿
2014/09/03 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
团员自我评价范文
2015/03/10 职场文书
冰雪公主观后感
2015/06/16 职场文书
新年寄语2016
2015/08/17 职场文书
感谢信
2019/04/11 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
Python pyecharts绘制条形图详解
2022/04/02 Python
搭建Yolov5服务器
2022/04/30 Servers