PHP实现自定义中奖和概率算法
最近玩《QQ飞车手游》,出了一款点券A车,需要消耗抽奖券抽奖,甚是激动,于是抽了几次,没想到中的都是垃圾道具,可恨可叹~~
这几天项目中也涉及到了类似的概率操作,于是思考了一下,简单分装了一个精确到万分之一的概率算法实现类,废话不多说上代码。
<?php /**
* Created by PhpStorm.
* User: hgq
* Date: 2018/05/07
* Time: 上午 10:00
* 一个抽奖类,精确到万分之一
* 三个步骤:1.接受一个中奖概率数组;2.接受一个抽奖种子;3.返回中奖等级
*/
class LuckyDraw {
/**
* 中奖概率数组,自动判断奖项数目
* 数组键值和为10000,自动计算出不中奖的概率,若初始是超过10000抛出一个错误
* @var array
*/
protected $_rate = array(); /**
* 设置中奖概率,
* @param array $rate 中奖概率,以数组形式传入
* @throws Exception
* @author hgq <393210556@qq.com>.
* @date: 2018/05/07 上午 10:05
*/
public function setRate($rate = array(1)) {
$this->_rate = $rate;
if(array_sum($this->_rate) > 10000)//检测概率设置是否有问题
throw new Exception('Winning rate upto 100%');
if(array_sum($this->_rate) < 10000)
//定义未中奖情况的概率,用户给的概率只和为100时,则忽略0
$this->_rate[] = 10000 - array_sum($this->_rate);
} /**
* 随机生成一个1-10000的整数种子,提交给中奖判断函数
* @return int 按传入的概率排序,返回中奖的项数
* @author hgq <393210556@qq.com>.
* @date: 2018/05/07 上午 10:07
*/
public function runOnce() {
return $this->judge(mt_rand(0, 10000));
} /**
* 按所设置的概率,判断一个传入的随机值是否中奖
* @param $seed 10000以内的随机数
* @return int $i 按传入的概率排序,返回中奖的项数 从1开始 如果只有一个奖项则等于1即中奖
* @author hgq <393210556@qq.com>.
* @date: 2018/05/07 上午 10:17
*/
protected function judge($seed) {
foreach($this->_rate as $key => $value) {
$tmpArr[$key + 1] = $value;
}
//将概率累计,以便随机选择,组合成
$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; //返回中奖的项数(按概率的设置顺序)
}
}
}
}
最后看一下运行效果,循环运行10000次

上述设置了6款产品,概率分别为100,200,500,600,420,512,多次运行中奖概率基本符合概率设置,如果将对应的奖项的设置成0,即意味着该奖项抽中的几率是0
最后说一下为什么抽不到大奖?
在很多类似的抽奖活动中,参与者往往抽不到大奖,笔者从程序的角度举个例给你看,假如我是抽奖活动的主办方,我设置了6个奖项,每个奖项不同的中奖概率,假如一等奖是一台iphoneX,可是我设置了其中奖概率为0,这意味着什么?
这意味着参与抽奖者无论怎么抽,永远也无法中奖。
所以抽奖有风险,操作需谨慎啊~~
作者:旧旧的 <393210556@qq.com> 解决问题的方式,就是解决它一次
PHP实现自定义中奖和概率算法的更多相关文章
- 【微信开发】PHP中奖概率经典算法实例
$arr=array("50","30","20"); //这里简单列出三个数 $pro = array_sum($arr); // 概率数 ...
- .net C# 抽奖,中奖
demo设置了8个奖项,每个奖项可以自定义中奖率,精度为1/10000 public string PrizeDraw() { //奖品以及中奖率 const string prizeString = ...
- php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法.用法很简单,代码里有详细注释说明,一看就懂 <?php /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为: ...
- 高处胜寒 php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
<?php /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为:array(100,200,300,400), * 开始是从1,1000 这个概率范围内筛选第一 ...
- php 中奖概率算法
我们先完成后台PHP的流程,PHP的主要工作是负责配置奖项及对应的中奖概率,当前端页面点击翻动某个方块时会想后台PHP发送ajax请求,那么后台PHP根据配置的概率,通过概率算法给出中奖结果,同时将未 ...
- 中奖概率算法(php 可用于刮刮卡,大转盘等抽奖算法)
<?php //中奖概率算法(php 可用于刮刮卡,大转盘等抽奖算法) /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为:array(100,200,300, ...
- PHP大转盘中奖概率算法实例
本文实例讲述了PHP大转盘中奖概率算法的实现方法,分享给大家供大家参考.具体如下: 大转盘是最近很多线上网动中一个比较有意思的东西了,下面我们就来看看这个大转盘中奖概率算法与例子,希望对各位有所帮助. ...
- php编写的抽奖程序中奖概率算法
本文给大家分享的是php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法.用法很简单,代码里有详细注释说明,一看就懂,有需要的小伙伴参考下吧. 我们先完成后台PHP的流程,PHP的主要工作是负责配置奖项及 ...
- PHP+jQuery实现翻板抽奖(中奖概率算法)
在电视节目中有一种抽奖形式暂且叫做翻板抽奖,台上有一个墙面,墙面放置几个大方块,主持人或者抽奖者翻开对应的方块即可揭晓中奖结果.类似的抽奖形式还可以应用在WEB中,本文将使用PHP+jQuery为您讲 ...
随机推荐
- 【Git版本控制】git中reset命令的详解
git reset 命令详解(一) git reset 命令详解(二) reset命令的语法:git reset [选项] [版本号] [要回退的目标] 选项:--soft仅将head指针指向历史 ...
- sphinx增量索引使用
sphinx在使用过程中如果表的数据量很大,新增加的内容在sphinx索引没有重建之前都是搜索不到的. 这时可以通过建立sphinx增量索引,通过定时更新增量索引,合并主索引的方式,来实现伪实时更新. ...
- Unity基础-发布
PC BuildSetting File->BuildSetting Switch Platform Development Build是在调试模式下使用版本 Script Debugging调 ...
- C语言中sizeof的用法
今天同学问我sizeof可不可以计算结构体的大小,我竟然忘了C语言还有sizeof这个函数,我是多久没有写程序了啊!!!惭愧,上研究生后写嵌入式方面的程序就特别少了,看来以后还要经常来练练手才行.现在 ...
- CodeForce:732B-Cormen — The Best Friend Of a Man
传送门:http://codeforces.com/problemset/problem/732/B Cormen - The Best Friend Of a Man time limit per ...
- The 2018 ACM-ICPC Chinese Collegiate Programming Contest Caesar Cipher
#include <iostream> #include <cstdio> #include <cstring> #include <string> # ...
- list_add_tail()双向链表实现分析
struct list_head { struct list_head *next, *prev; }; list_add_tail(&buf->vb.queue, &vid-& ...
- Python中的并发
目录 Python并发 并发三种层次 协程 生成者消费者 新关键字 网络io 线/进程 例子 线程池 进程通信 并发池 future对象 executor对象 参考 Python并发 并发三种层次 个 ...
- 下载linaro android 4.4.2 for panda4460
$ export MANIFEST_REPO=git://android.git.linaro.org/platform/manifest.git$ export MANIFEST_BRANCH=li ...
- bash循环for/while/until
shell流程控制之一:for循环 for VAR in LIST; do STATEMENT1 ... done 例: ...