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面向对象 字段的声明与使用
Jun 14 PHP
对象失去焦点时自己动提交数据的实现代码
Nov 06 PHP
深入PHP操作MongoDB的技术总结
Jun 02 PHP
php表单请求获得数据求和示例
May 15 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
PHP Cookei记录用户历史浏览信息的代码
Feb 03 PHP
PHP中模拟链表和链表的基本操作示例
Feb 27 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
Mar 09 PHP
php错误日志简单配置方法
Jul 11 PHP
PHP中利用sleep函数实现定时执行功能实现代码
Aug 25 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 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
用Socket发送电子邮件
2006/10/09 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
2011/07/17 PHP
使用php判断浏览器的类型和语言的函数代码
2013/02/28 PHP
更改localhost为其他名字的方法
2014/02/10 PHP
php的sso单点登录实现方法
2015/01/08 PHP
PHP设计模式之观察者模式实例
2016/02/22 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
JS HTML5实现拖拽移动列表效果
2020/08/27 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
基于jquery实现二级联动效果
2017/03/30 jQuery
jQuery+HTML5实现WebGL高性能烟花绽放动画效果【附demo源码下载】
2017/08/18 jQuery
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
python使用xmlrpc实例讲解
2013/12/17 Python
使用SAE部署Python运行环境的教程
2015/05/05 Python
python进行TCP端口扫描的实现
2018/12/21 Python
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
世界上最好的足球商店:Unisport
2019/03/02 全球购物
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
俄罗斯购买剧院和演唱会门票网站:Parter.ru
2019/11/09 全球购物
元旦晚会策划方案
2014/02/18 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
公安民警正风肃纪剖析材料
2014/10/10 职场文书
2014年电工工作总结
2014/11/20 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书
论文致谢词范文
2015/05/14 职场文书
鲁冰花观后感
2015/06/10 职场文书
致运动员的广播稿
2015/08/19 职场文书
Python中rapidjson参数校验实现
2021/07/25 Python
Pandas-DataFrame知识点汇总
2022/03/16 Python