最近公司有两个活动, 一个是砸蛋活动, 另一个是转盘活动。

后台这边需要做接口进行对接,当用户在前台点击进行抽奖的时候,发送AJAX请求给后台,后台进行业务处理包括记录用户中奖信息,然后返回json格式的数据给前台进行显示 其中最为核心的就是中奖的算法逻辑了。

在网上查看了一些算法之后发现下面这种算法效率比较高。

 <?php
//中奖奖品
$prize_arr = array( 0=>array( 'id'=>1,'prize'=>'现金500W','v'=>1 ), //概率为1/200
1=>array( 'id'=>2,'prize'=>'iphone7','v'=>5 ),
2=>array( 'id'=>3,'prize'=>'耐克跑鞋','v'=>10 ),
3=>array( 'id'=>4,'prize'=>'魔声耳机','v'=>24 ),
4=>array( 'id'=>5,'prize'=>'蓝牙音响','v'=>60 ),
5=>array( 'id'=>6,'prize'=>'现金1元','v'=>100 ) ); /*
* 对数组进行处理
*/ foreach( $prize_arr as $k => $v ){
//使用新数组item
$item[$v['id']] = $v['v'];
} /*
array(
1 => 1,
2 => 5,
3 => 10,
4 => 24,
5 => 60,
6 => 100
);
*/ function get_rand($item){ $num = array_sum($item);//计算出分母200 foreach( $item as $k => $v ){ $rand = mt_rand(1, $num);//概率区间(整数) 包括1和200
/*
*这个算法很666
*/
if( $rand <= $v ){
//循环遍历,当下标$k = 1的时候,只有$rand = 1 才能中奖
$result = $k;
echo $rand.'--'.$v;
break;
}else{
//当下标$k=6的时候,如果$rand>100 必须$rand < = 100 才能中奖 ,那么前面5次循环之后$rand的概率区间= 200-1-5-10-24-60 (1,100) 必中1块钱
$num-=$v;
echo '*'.$rand.'*'."&ensp;"."&ensp;"."&ensp;";
}
} return $result;
} $res = get_rand($item);
$prize = $prize_arr[$res-1]['prize'];
echo $prize;

输出得到:

循环遍历,不停获取随机数并缩小概率空间,如果中一等奖只经过一层循环,概率越大的,经过循环的次数就越多有点像高中的概率的题目, 如果不中五等奖,那么必中六等奖!

php中奖算法逻辑的更多相关文章

  1. Java Script 中 ==(Equal) 和 === (Identity Equal) 的区别和比较算法逻辑

    判断两个变量是否相等在任何编程语言中都是非常重要的功能. JavaScript 提供了 == 和 === 两种判断两个变量是否相等的运算符,但我们开始学习的时候 JavaScript 的时候,就被一遍 ...

  2. 【斗地主技巧】斗地主算法逻辑中的天之道<转>

    ******************************************************************** 作者比较喜欢玩斗地主,所以经常搜集一些网友斗地主的心得,下面这 ...

  3. Python机器学习算法 — 逻辑回归(Logistic Regression)

    逻辑回归--简介 逻辑回归(Logistic Regression)就是这样的一个过程:面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型 ...

  4. GJM : 数据结构 - 轻松看懂机器学习十大常用算法 [转载]

     转载请联系原文作者 需要获得授权,非法转载 原文作者将享受侵权诉讼 文/不会停的蜗牛(简书作者)原文链接:http://www.jianshu.com/p/55a67c12d3e9 通过本篇文章可以 ...

  5. 广告系统中weak-and算法原理及编码验证

    wand(weak and)算法基本思路 一般搜索的query比较短,但如果query比较长,如是一段文本,需要搜索相似的文本,这时候一般就需要wand算法,该算法在广告系统中有比较成熟的应 该,主要 ...

  6. 什么是系统,什么是算法 -- lemon OA 系统学习总结

    一.对于模块划分的理解 对于一个大型(这里还只是一个中型系统)系统来说,代码的编写不是一日而就的,层次的明细也不是一眼就能看清楚的. 在这种情况下,需要想好,最好是由上而下地想好. 能够模块式地划分最 ...

  7. 卷积神经网络(CNN)前向传播算法

    在卷积神经网络(CNN)模型结构中,我们对CNN的模型结构做了总结,这里我们就在CNN的模型基础上,看看CNN的前向传播算法是什么样子的.重点会和传统的DNN比较讨论. 1. 回顾CNN的结构 在上一 ...

  8. 自然语言处理之Levenshtien Distance算法研究

    自然语言处理中,一个很重要的应用就是问答系统,这里面,涉及到问题和知识库里面的问题的匹配度,从而检索出问题的答案,这个是一个比较常见的应用算法. 编辑距离(Edit Distance),又称Leven ...

  9. 排序算法<No.3>【桶排序】

    算法,是永恒的技能,今天继续算法篇,将研究桶排序. 算法思想: 桶排序,其思想非常简单易懂,就是是将一个数据表分割成许多小数据集,每个数据集对应于一个新的集合(也就是所谓的桶bucket),然后每个b ...

随机推荐

  1. springmvc注解式事务手动回滚

    Spring的AOP事务管理默认是针对unchecked exception回滚(运行期异常,Runtime Exception),如果希望手动控制事务的回滚,可以通过 TransactionAspe ...

  2. 【吐血整理】svn命令行,Subversion的正确使用姿势~

    一.写在前面 前面一直博主一直用svn的桌面版本,但看项目经理一直都用的命令行方式,不为性能,还能直接装逼呀!在这里先感谢赵哥,也把它分享给感兴趣的你们~ 二.直接上干货 1. svn checkou ...

  3. BZOJ 3479: [Usaco2014 Mar]Watering the Fields(最小生成树)

    这个= =最近刷的都是水题啊QAQ 排除掉不可能的边然后就最小生成树就行了= = CODE: #include<cstdio>#include<iostream>#includ ...

  4. Spark 键值对RDD操作

    键值对的RDD操作与基本RDD操作一样,只是操作的元素由基本类型改为二元组. 概述 键值对RDD是Spark操作中最常用的RDD,它是很多程序的构成要素,因为他们提供了并行操作各个键或跨界点重新进行数 ...

  5. 读书笔记 effective c++ Item 26 尽量推迟变量的定义

    1. 定义变量会引发构造和析构开销 每当你定义一种类型的变量时:当控制流到达变量的定义点时,你引入了调用构造函数的开销,当离开变量的作用域之后,你引入了调用析构函数的开销.对未使用到的变量同样会产生开 ...

  6. Java日志工具之Log4J

    Log4J与java.util.logging.Logger的使用方式出奇的相似,因此如果先看这篇文章<Java日志工具之java.util.logging.Logger>在来用Log4J ...

  7. Lambda&Java多核编程-5-函数式接口与function包

    从前面的总结中我们知道Lambda的使用场景是实现一个函数式接口,那么本篇就将阐述一下何为函数式接口以及Java的function包中提供的几种函数原型. 函数式接口 早期也叫作SAM(Single ...

  8. HTML友情链接代码

    <div align="center">     <table width="980" height="35" borde ...

  9. 1596: [Usaco2008 Jan]电话网络

    1596: [Usaco2008 Jan]电话网络 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 601  Solved: 265[Submit][S ...

  10. servlet匹配规则和顺序

    1.  写法 ①完全匹配:以“/”开头,以字母(非“*”)结束    如:<url-pattern>/test/list.do</url-pattern> ②目录匹配:以“/” ...