本文给大家分享的是php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法。用法很简单,代码里有详细注释说明,一看就懂,有需要的小伙伴参考下吧。

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

先来看概率计算函数

  1. function get_rand($proArr) {
  2. $result = '';
  3. //概率数组的总概率精度
  4. $proSum = array_sum($proArr);
  5. //概率数组循环
  6. foreach ($proArr as $key => $proCur) {
  7. $randNum = mt_rand(1, $proSum);
  8. if ($randNum <= $proCur) {
  9. $result = $key;
  10. break;
  11. } else {
  12. $proSum -= $proCur;
  13. }
  14. }
  15. unset ($proArr);
  16. return $result;
  17. }

上述代码是一段经典的概率算法,$proArr是一个预先设置的数组,假设数组为:array(100,200,300,400),开始是从1,1000这个概率范围内筛选第一个数是否在他的出现概率范围之内, 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。这样筛选到最终,总会有一个数满足要求。就相当于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个一定是。这个算法简单,而且效率非常高,关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。

接下来我们通过PHP配置奖项。

  1. $prize_arr = array(
  2. '0' => array('id'=>1,'prize'=>'平板电脑','v'=>1),
  3. '1' => array('id'=>2,'prize'=>'数码相机','v'=>5),
  4. '2' => array('id'=>3,'prize'=>'音箱设备','v'=>10),
  5. '3' => array('id'=>4,'prize'=>'4G优盘','v'=>12),
  6. '4' => array('id'=>5,'prize'=>'10Q币','v'=>22),
  7. '5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),
  8. );

该二维数组,记录了所有本次抽奖的奖项信息,其中id表示中奖等级,prize表示奖品,v表示中奖概率。注意其中的v必须为整数,你可以将对应的奖项的v设置成0,即意味着该奖项抽中的几率是0,数组中v的总和(基数),基数越大越能体现概率的准确性。本例中v的总和为100,那么平板电脑对应的中奖概率就是1%,如果v的总和是10000,那中奖概率就是万分之一了。

每次前端页面的请求,PHP循环奖项设置数组,通过概率计算函数get_rand获取抽中的奖项id。将中奖奖品保存在数组$res['yes']中,而剩下的未中奖的信息保存在$res['no']中,最后输出json个数数据给前端页面。

  1. foreach ($prize_arr as $key => $val) {
  2. $arr[$val['id']] = $val['v'];
  3. }
  4. $rid = get_rand($arr); //根据概率获取奖项id
  5. $res['yes'] = $prize_arr[$rid-1]['prize']; //中奖项
  6. unset($prize_arr[$rid-1]); //将中奖项从数组中剔除,剩下未中奖项
  7. shuffle($prize_arr); //打乱数组顺序
  8. for($i=0;$i<count($prize_arr);$i++){
  9. $pr[] = $prize_arr[$i]['prize'];
  10. }
  11. $res['no'] = $pr;
  12. echo json_encode($res);

另附上一个网友的实现方法

  1. /**
  2. * 抽奖
  3. * @param int $total
  4. */
  5. function getReward($total=1000)
  6. {
  7. $win1 = floor((0.12*$total)/100);
  8. $win2 = floor((3*$total)/100);
  9. $win3 = floor((12*$total)/100);
  10. $other = $total-$win1-$win2-$win3;
  11. $return = array();
  12. for ($i=0;$i<$win1;$i++)
  13. {
  14. $return[] = 1;
  15. }
  16. for ($j=0;$j<$win2;$j++)
  17. {
  18. $return[] = 2;
  19. }
  20. for ($m=0;$m<$win3;$m++)
  21. {
  22. $return[] = 3;
  23. }
  24. for ($n=0;$n<$other;$n++)
  25. {
  26. $return[] = '谢谢惠顾';
  27. }
  28. shuffle($return);
  29. return $return[array_rand($return)];
  30. }
  31. $data = getReward();
  32. echo $data;
  33. ?>

本文给大家分享的是php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法。用法很简单,代码里有详细注释说明,一看就懂,有需要的小伙伴参考下吧。

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

先来看概率计算函数

  1. function get_rand($proArr) {
  2. $result = '';
  3. //概率数组的总概率精度
  4. $proSum = array_sum($proArr);
  5. //概率数组循环
  6. foreach ($proArr as $key => $proCur) {
  7. $randNum = mt_rand(1, $proSum);
  8. if ($randNum <= $proCur) {
  9. $result = $key;
  10. break;
  11. } else {
  12. $proSum -= $proCur;
  13. }
  14. }
  15. unset ($proArr);
  16. return $result;
  17. }

上述代码是一段经典的概率算法,$proArr是一个预先设置的数组,假设数组为:array(100,200,300,400),开始是从1,1000这个概率范围内筛选第一个数是否在他的出现概率范围之内, 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间,在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。这样筛选到最终,总会有一个数满足要求。就相当于去一个箱子里摸东西,第一个不是,第二个不是,第三个还不是,那最后一个一定是。这个算法简单,而且效率非常高,关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。

接下来我们通过PHP配置奖项。

  1. $prize_arr = array(
  2. '0' => array('id'=>1,'prize'=>'平板电脑','v'=>1),
  3. '1' => array('id'=>2,'prize'=>'数码相机','v'=>5),
  4. '2' => array('id'=>3,'prize'=>'音箱设备','v'=>10),
  5. '3' => array('id'=>4,'prize'=>'4G优盘','v'=>12),
  6. '4' => array('id'=>5,'prize'=>'10Q币','v'=>22),
  7. '5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),
  8. );

该二维数组,记录了所有本次抽奖的奖项信息,其中id表示中奖等级,prize表示奖品,v表示中奖概率。注意其中的v必须为整数,你可以将对应的奖项的v设置成0,即意味着该奖项抽中的几率是0,数组中v的总和(基数),基数越大越能体现概率的准确性。本例中v的总和为100,那么平板电脑对应的中奖概率就是1%,如果v的总和是10000,那中奖概率就是万分之一了。

每次前端页面的请求,PHP循环奖项设置数组,通过概率计算函数get_rand获取抽中的奖项id。将中奖奖品保存在数组$res['yes']中,而剩下的未中奖的信息保存在$res['no']中,最后输出json个数数据给前端页面。

  1. foreach ($prize_arr as $key => $val) {
  2. $arr[$val['id']] = $val['v'];
  3. }
  4. $rid = get_rand($arr); //根据概率获取奖项id
  5. $res['yes'] = $prize_arr[$rid-1]['prize']; //中奖项
  6. unset($prize_arr[$rid-1]); //将中奖项从数组中剔除,剩下未中奖项
  7. shuffle($prize_arr); //打乱数组顺序
  8. for($i=0;$i<count($prize_arr);$i++){
  9. $pr[] = $prize_arr[$i]['prize'];
  10. }
  11. $res['no'] = $pr;
  12. echo json_encode($res);

另附上一个网友的实现方法

  1. /**
  2. * 抽奖
  3. * @param int $total
  4. */
  5. function getReward($total=1000)
  6. {
  7. $win1 = floor((0.12*$total)/100);
  8. $win2 = floor((3*$total)/100);
  9. $win3 = floor((12*$total)/100);
  10. $other = $total-$win1-$win2-$win3;
  11. $return = array();
  12. for ($i=0;$i<$win1;$i++)
  13. {
  14. $return[] = 1;
  15. }
  16. for ($j=0;$j<$win2;$j++)
  17. {
  18. $return[] = 2;
  19. }
  20. for ($m=0;$m<$win3;$m++)
  21. {
  22. $return[] = 3;
  23. }
  24. for ($n=0;$n<$other;$n++)
  25. {
  26. $return[] = '谢谢惠顾';
  27. }
  28. shuffle($return);
  29. return $return[array_rand($return)];
  30. }
  31. $data = getReward();
  32. echo $data;
  33. ?>

以上所述就是本文的全部内容了,希望大家能够喜欢。

php编写的抽奖程序中奖概率算法的更多相关文章

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

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

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

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

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

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

  4. 幸运大转盘-jQuery+PHP实现的抽奖程序

    目前好多网站上应用的转盘抽奖程序大多是基于flash的,而本文结合实例将使用jQuery和PHP来实现转盘抽奖程序,为了便于理解,作者分两部分来讲解,本文讲解第一部分,侧重使用jQuery实现转盘的转 ...

  5. 使用jQuery+PHP+Mysql实现抽奖程序

    抽奖程序在实际生活中广泛运用,由于应用场景不同抽奖的方式也是多种多样的.本文将采用实例讲解如何利用jQuery+PHP+Mysql实现类似电视中常见的一个简单的抽奖程序. 查看演示 本例中的抽奖程序要 ...

  6. 一个好玩的jq+php实现转盘抽奖程序

    前台页面: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <met ...

  7. java模拟一个抽奖程序

    今天用一个程序模拟一个从1-32之间,随机抽取7组号码的抽奖程序 * 需要使用Java的图形界面知识 * 窗口  JFrame * 面板  JPanel * 显示文本信息的标签  JLabel * 文 ...

  8. java程序设计 彩票购买抽奖程序 团队博客

    一.项目介绍 题目要求 功能要求: 模拟福利彩票36选7,实现彩票的抽奖与中奖通知功能. 1.允许注册用户,用户信息包括用户id,用户名,密码,账户金额,电话号码等属性. 2.允许注册用户购买彩票:手 ...

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

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

随机推荐

  1. Android UI开发第三十九篇——Tab界面实现汇总及比较

    Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...

  2. 面试STAR法则

    昨天投了几家公司的简历,A公司还没看简历,B公司没有通过简历,另外的后说(其实只投了这两家),B公司最终给了蛮中肯的回复: 虽然,一开始看到这样的结果,有些失落,仔细看过回复后,有些不屑和好奇.百度了 ...

  3. storyboard设置navigation controller

    到storyboard选中我们唯一一个的viewcontroller,找到xcode的菜单栏,Edit->Embed In->NavigationController.这时候storybo ...

  4. @Override must override a superclass method 有关问题解决

    1.Java开发环境时 如果在使用Eclipse开发Java项目时,在使用 @Override 出现以下错误: The method *** of type *** must override a s ...

  5. [Algorithms] Graph Traversal (BFS and DFS)

    Graph is an important data structure and has many important applications. Moreover, grach traversal ...

  6. Refused to execute script from '....js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.md

    目录 问题描述 解决过程 总结 问题描述 在整合 Spring Boot.Spring Security.Thymeleaf 的练习中,对页面进行调试时,发现如下错误提示: Refused to ex ...

  7. delphi 遇到问题、报错等

    解决方法:using Windows

  8. Setting IE11 with Group Policy Preferences

    一.Setting Home Page with Group Policy Preferences 1.Open the Group Policy Management Console and cre ...

  9. Backtracking is a form of recursion.

    w https://www.cis.upenn.edu/~matuszek/cit594-2012/Pages/backtracking.html Starting at Root, your opt ...

  10. Hibernate 的查询

    1. Hibernate 框架的查询方式 唯一标识OID的检索方式: session.get(对象.class, OID) 对象导航的方式; HQL 检索方式; QBC 检索方式; SQL 检索方式 ...