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 相关文章推荐
mysql5的sql文件导入到mysql4的方法
Oct 19 PHP
Views rows style模板重写代码
May 16 PHP
yii框架中的Url生产问题小结
Jan 16 PHP
关于PHP结束标签的使用细节探讨及联想
Mar 04 PHP
PHP版 汉字转码的实现详解
Jun 09 PHP
Laravel 4 初级教程之视图、命名空间、路由
Oct 30 PHP
php之curl设置超时实例
Nov 03 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
Dec 25 PHP
为PHP5.4开启Zend OPCode缓存
Dec 26 PHP
php返回字符串中所有单词的方法
Mar 09 PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 PHP
PHP调用接口API封装的例子
Oct 11 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
DC动画很好看?新作烂得令人发指,名叫《红色之子》
2020/04/09 欧美动漫
PHP中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
JS控制表格隔行变色
2006/06/26 Javascript
javascript jQuery $.post $.ajax用法
2008/07/09 Javascript
JavaScript 异步调用框架 (Part 5 - 链式实现)
2009/08/04 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
jquery图片切换插件
2015/03/16 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
2019/08/16 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
[03:42]2016国际邀请赛中国区预选赛首日现场玩家采访
2016/06/26 DOTA
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
Python实现中文数字转换为阿拉伯数字的方法示例
2017/05/26 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
基于python实现从尾到头打印链表
2019/11/02 Python
在Django中实现添加user到group并查看
2019/11/18 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
大型会议接待方案
2014/03/01 职场文书
商务助理求职信范文
2014/04/20 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
民主生活会对照检查材料思想汇报
2014/09/27 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
关于倡议书的范文
2015/04/29 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
情况说明书格式及范文
2019/06/24 职场文书
导游词之镜泊湖
2019/12/09 职场文书
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL