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 中include()与require()的对比
Oct 09 PHP
如何使用PHP往windows中添加用户
Dec 06 PHP
使用eAccelerator加密PHP程序
Oct 03 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
Jun 18 PHP
php检测url是否存在的方法
Apr 14 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
PHP框架Laravel插件Pagination实现自定义分页
Apr 22 PHP
PHP面向对象中new self()与 new static()的区别浅析
Aug 17 PHP
Yii2.0建立公共方法简单示例
Jan 29 PHP
PHP架构及原理知识点详解
Dec 22 PHP
php并发加锁问题分析与设计代码实例讲解
Feb 26 PHP
详解Laravel制作API接口
May 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
PHP实现链式操作的核心思想
2015/06/23 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
2013/05/14 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
2015/10/09 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
nodejs个人博客开发第三步 载入页面
2017/04/12 NodeJs
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
详解搭建es6+devServer简单开发环境
2018/09/25 Javascript
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
JS实现鼠标移动拖尾
2020/12/27 Javascript
vue实现树状表格效果
2020/12/29 Vue.js
Python实现周期性抓取网页内容的方法
2015/11/04 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
Python编程实现二叉树及七种遍历方法详解
2017/06/02 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
Python3简单实例计算同花的概率代码
2017/12/06 Python
python去除拼音声调字母,替换为字母的方法
2018/11/28 Python
Python装饰器用法实例分析
2019/01/14 Python
python进阶之自定义可迭代的类
2019/08/20 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
电子信息科学专业自荐信
2014/01/30 职场文书
企业读书活动总结
2014/06/30 职场文书
店铺转让协议书
2015/01/29 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
变长双向rnn的正确使用姿势教学
2021/05/31 Python
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python