最近玩《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实现自定义中奖和概率算法的更多相关文章

  1. 【微信开发】PHP中奖概率经典算法实例

    $arr=array("50","30","20"); //这里简单列出三个数 $pro = array_sum($arr); // 概率数 ...

  2. .net C# 抽奖,中奖

    demo设置了8个奖项,每个奖项可以自定义中奖率,精度为1/10000 public string PrizeDraw() { //奖品以及中奖率 const string prizeString = ...

  3. php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法

    php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法.用法很简单,代码里有详细注释说明,一看就懂 <?php /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为: ...

  4. 高处胜寒 php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法

    <?php /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为:array(100,200,300,400), * 开始是从1,1000 这个概率范围内筛选第一 ...

  5. php 中奖概率算法

    我们先完成后台PHP的流程,PHP的主要工作是负责配置奖项及对应的中奖概率,当前端页面点击翻动某个方块时会想后台PHP发送ajax请求,那么后台PHP根据配置的概率,通过概率算法给出中奖结果,同时将未 ...

  6. 中奖概率算法(php 可用于刮刮卡,大转盘等抽奖算法)

    <?php //中奖概率算法(php 可用于刮刮卡,大转盘等抽奖算法) /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为:array(100,200,300, ...

  7. PHP大转盘中奖概率算法实例

    本文实例讲述了PHP大转盘中奖概率算法的实现方法,分享给大家供大家参考.具体如下: 大转盘是最近很多线上网动中一个比较有意思的东西了,下面我们就来看看这个大转盘中奖概率算法与例子,希望对各位有所帮助. ...

  8. php编写的抽奖程序中奖概率算法

    本文给大家分享的是php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法.用法很简单,代码里有详细注释说明,一看就懂,有需要的小伙伴参考下吧. 我们先完成后台PHP的流程,PHP的主要工作是负责配置奖项及 ...

  9. PHP+jQuery实现翻板抽奖(中奖概率算法)

    在电视节目中有一种抽奖形式暂且叫做翻板抽奖,台上有一个墙面,墙面放置几个大方块,主持人或者抽奖者翻开对应的方块即可揭晓中奖结果.类似的抽奖形式还可以应用在WEB中,本文将使用PHP+jQuery为您讲 ...

随机推荐

  1. nginx的url重写

    1.1 简介 url重写由ngx_http_rewrite_module模块提供,默认会安装,但该模块功能的实现需要pcre.URL重写技术不仅要求掌握几个指令的语法.熟悉简单的正则表达式,还需要尽量 ...

  2. Linux 用户管理(二)

    一.groupadd --create a new group 创建新用户 -g  --gid GID 二.groupdel --delete a group 三.passwd --update us ...

  3. 探讨2018年最受欢迎的15顶级Python库!

    近日,数据科学网站 KDnuggets 评选出了顶级 Python 库 Top15,领域横跨数据科学.数据可视化.深度学习和机器学习.如果本文有哪些遗漏,你可以在评论区补充. 图 1:根据 GitHu ...

  4. 使用TensorFlow的卷积神经网络识别手写数字(1)-预处理篇

    功能: 将文件夹下的20*20像素黑白图片,根据重心位置绘制到28*28图片上,然后保存.经过预处理的图片有利于数字的准确识别.参见MNIST对图片的要求. 此处可下载已处理好的图片: https:/ ...

  5. 如何在微信中发送"相册"文件时有选择性地显示视频文件

    相信很多微信用户在使用微信给朋友,同事发送相册中的文件时,微信会显示你手机中的视频文件,这样很不方便. 如果要完全不显示视频文件: 随便在手机中建立一个文件夹,名字叫 ".nomedia&q ...

  6. LeetCode(226)Invert Binary Tree

    题目 分析 交换二叉树的左右子树. 递归非递归两种方法实现. AC代码 class Solution { public: //递归实现 TreeNode* invertTree(TreeNode* r ...

  7. FSMC原理通俗解释

    所以不用GPIO口直接驱动液晶,是因为这种方法速度太慢,而FSMC是用来外接各种存储芯片的,所以其数据通信速度是比普通GPIO口要快得多的.TFT-LCD 驱动芯片的读写时序和SRAM的差不多,所以就 ...

  8. HDU 2242 双连通分量 考研路茫茫——空调教室

    思路就是求边双连通分量,然后缩点,再用树形DP搞一下. 代码和求强连通很类似,有点神奇,=_=,慢慢消化吧 #include <cstdio> #include <cstring&g ...

  9. 深入Python底层,谈谈内存管理机制

    说到内存管理,就先说一下垃圾回收吧.垃圾回收是Python,Java等语言管理内存的一种方式,说的直白些,就是清除无用的垃圾对象.C语言及C++中,需要通过malloc来进行内存的申请,通过free而 ...

  10. studio rendering problems

    问题--------> Rendering Problems The following classes could not be instantiated: - android.support ...