当前位置:首页 > PHP教程 > php应用 > 列表

基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-30 20:27:52 浏览: 评论:0 

大转盘中奖概率算法在我们的日常生活中,经常遇到,那么基于php代码是如何实现中奖概率算法的,下面通过一段代码实例给大家介绍php中奖概率算法,代码简单易懂,并且附有注释,具体代码如下所示:

  1. <?php 
  2. /* 
  3.  * 经典的概率算法, 
  4.  * $proArr是一个预先设置的数组, 
  5.  * 假设数组为:array(100,200,300,400), 
  6.  * 开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范围之内,  
  7.  * 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间, 
  8.  * 在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选的。 
  9.  * 这样 筛选到最终,总会有一个数满足要求。 
  10.  * 就相当于去一个箱子里摸东西, 
  11.  * 第一个不是,第二个不是,第三个还不是,那最后一个一定是。 
  12.  * 这个算法简单,而且效率非常 高, 
  13.  * 关键是这个算法已在我们以前的项目中有应用,尤其是大数据量的项目中效率非常棒。 
  14.  */ 
  15. function get_rand($proArr) {  
  16.  $result = '';  
  17.  //概率数组的总概率精度  
  18.  $proSum = array_sum($proArr);  
  19.  //概率数组循环  
  20.  foreach ($proArr as $key => $proCur) {  
  21.   $randNum = mt_rand(1, $proSum);  
  22.   if ($randNum <= $proCur) {  
  23.    $result = $key;  
  24.    break;  
  25.   } else {  
  26.    $proSum -= $proCur;  
  27.   }    
  28.  }  
  29.  unset ($proArr);  
  30.  return $result;  
  31. }  
  32. /* 
  33.  * 奖项数组 
  34.  * 是一个二维数组,记录了所有本次抽奖的奖项信息, 
  35.  * 其中id表示中奖等级,prize表示奖品,v表示中奖概率。 
  36.  * 注意其中的v必须为整数,你可以将对应的 奖项的v设置成0,即意味着该奖项抽中的几率是0, 
  37.  * 数组中v的总和(基数),基数越大越能体现概率的准确性。 
  38.  * 本例中v的总和为100,那么平板电脑对应的 中奖概率就是1%, 
  39.  * 如果v的总和是10000,那中奖概率就是万分之一了。 
  40.  *  
  41.  */ 
  42. $prize_arr = array(  
  43.  '0' => array('id'=>1,'prize'=>'平板电脑','v'=>1),  
  44.  '1' => array('id'=>2,'prize'=>'数码相机','v'=>5),  
  45.  '2' => array('id'=>3,'prize'=>'音箱设备','v'=>10),  
  46.  '3' => array('id'=>4,'prize'=>'4G优盘','v'=>12),  
  47.  '4' => array('id'=>5,'prize'=>'10Q币','v'=>22),  
  48.  '5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),  
  49. );  
  50. /* 
  51.  * 每次前端页面的请求,PHP循环奖项设置数组, 
  52.  * 通过概率计算函数get_rand获取抽中的奖项id。 
  53.  * 将中奖奖品保存在数组$res['yes']中, 
  54.  * 而剩下的未中奖的信息保存在$res['no']中, 
  55.  * 最后输出json个数数据给前端页面。 
  56.  */ 
  57. foreach ($prize_arr as $key => $val) {  
  58.  $arr[$val['id']] = $val['v'];  
  59. }  
  60. $rid = get_rand($arr); //根据概率获取奖项id  
  61. $res['yes'] = $prize_arr[$rid-1]['prize']; //中奖项  
  62. unset($prize_arr[$rid-1]); //将中奖项从数组中剔除,剩下未中奖项  
  63. shuffle($prize_arr); //打乱数组顺序  
  64. for($i=0;$i<count($prize_arr);$i++){  
  65.  $pr[] = $prize_arr[$i]['prize'];  
  66. }  
  67. $res['no'] = $pr;  
  68. print_r($res); 

下面再给大家分享一段实例代码基于Java实现中奖概率计算,做移动的项目,有个需求,做个摇奖的活动!其中中奖的计算比较恶心,用户要改动各个奖项的中奖概率,而且每天的奖项有个数限制。一二三四五六等奖,概率不通,怎么算一个用户参与了中没中将呢?苦思了一下,可以用Random类的 nextInt(int x)方法产生一个范围内的随机数,产生到那个区间就是几等奖了,中奖区间的产生是动态的。贴出源代码,仅供参考!

  1. package Mzone; 
  2. import java.util.ArrayList; 
  3. import java.util.Random; 
  4. public class Mzone { 
  5.  /** 
  6.  * CopyRright(c)2009-04:  
  7.  * Project:  
  8.  * Module ID:  
  9.  * Comments: 概率计算 
  10.  * JDK version used: <JDK1.4> 
  11.  * Author:ch 
  12.  * Create Date:2009-04-20 
  13.  * Modified By:  
  14.  * Modified Date:  
  15.  * Why & What is modified  
  16.  * Version: 1.0 
  17.  */ 
  18.  static Random r = new Random(); 
  19.  public static void main(String[] args) { 
  20.   //各个奖项的中奖概率的分母 
  21.   Integer _5m = new Integer(5); 
  22.   Integer _500m = new Integer(30); 
  23.   Integer _ipod = new Integer(500); 
  24.   Integer _phone = new Integer(1000); 
  25.   Integer _notebook = new Integer(1500); 
  26.   Integer _jay = new Integer(50); 
  27.   ArrayList list = new ArrayList(); 
  28.   if(_5m.intValue()!=0) 
  29.    list.add(_5m); 
  30.   if(_500m.intValue()!=0) 
  31.    list.add(_500m); 
  32.   if(_ipod.intValue()!=0) 
  33.    list.add(_ipod); 
  34.   if(_phone.intValue()!=0) 
  35.    list.add(_phone); 
  36.   if(_notebook.intValue()!=0) 
  37.    list.add(_notebook); 
  38.   if(_jay.intValue()!=0) 
  39.    list.add(_jay); 
  40.   //计算最小公倍数 
  41.   int common = getN(list); 
  42.   System.out.println("最小公倍数:"+common); 
  43.   int a = 0;int b = 0;int c = 0;int d = 0;int e = 0;int f = 0;int g = 0; 
  44.   int first = 0;int second = 0;int third = 0;int four = 0;int fifth = 0;int sixth = 0; 
  45.   if(_5m.intValue()!=0){ 
  46.    first = common/_5m.intValue(); 
  47.   } 
  48.   if(_500m.intValue()!=0){ 
  49.    second = first + (common/_500m.intValue()); 
  50.   }else second = first; 
  51.   if(_ipod.intValue()!=0){ 
  52.    third = second + (common/_ipod.intValue()); 
  53.   }else third = second; 
  54.   if(_phone.intValue()!=0){ 
  55.    four = third + (common/_phone.intValue()); 
  56.   }else four = third; 
  57.   if(_notebook.intValue()!=0){ 
  58.    fifth = four + (common/_notebook.intValue()); 
  59.   }else fifth = four; 
  60.   if(_jay.intValue()!=0){ 
  61.    sixth = fifth + (common/_jay.intValue()); 
  62.   }else sixth = fifth; 
  63.   int times = 30000;//循环次数 
  64.   for(int i = 0;i < times; i++){ 
  65.    int ri = getRandom(common);//产生随机数 
  66.    if(ri >= 0 && ri < first){ 
  67.     a++; 
  68.    }else if(ri >= first && ri < second){ 
  69.     b++; 
  70.    }else if(ri >= second && ri < third){ 
  71.     c++; 
  72.    }else if(ri >= third && ri < four){ 
  73.     d++; 
  74.    }else if(ri >= four && ri < fifth){ 
  75.     e++; 
  76.    }else if(ri >= fifth && ri < sixth){ 
  77.     f++; 
  78.    }else
  79.     g++; 
  80.    } 
  81.   } 
  82.   System.out.println("5m值:" + a + " 500m值:" + b + " ipodMP3:" + c + " 手机:" + d + " 笔记本电脑:" + e + " 演唱会门票:" + f + " 谢谢参与:" + g); 
  83.  } 
  84.  /** 
  85.   * 求最大公约数 
  86.  */ 
  87.  public static int gcd(int m, int n){ 
  88.   while (true){ 
  89.    if ((m = m % n) == 0) 
  90.    return n; 
  91.    if ((n = n % m) == 0) 
  92.    return m; 
  93.   } 
  94.  } 
  95.  /** 
  96.  * 求最小公倍数 
  97.  */ 
  98.  public static int gys(int z, int y){ 
  99.   int t = 0; 
  100.   int c = 0; 
  101.   c = gcd(z,y); 
  102.   t = z * y / c; 
  103.   return t; 
  104.  } 
  105.  /** 
  106.   * 求几个数的最小公倍数 
  107.  */ 
  108.  public static int getN(ArrayList list){ 
  109.   int t = 1; 
  110.   for(int i = 0;i<list.size();i++){ 
  111.    Integer temp = (Integer)list.get(i); 
  112.    t = gys(t,temp.intValue()); 
  113.   } 
  114.   return t;  
  115.  } 
  116.  /** 
  117.   * 产生随机数 
  118.  */ 
  119.  public static int getRandom(int y){ 
  120.   int result = r.nextInt(y); 
  121.   return result; 
  122.  } 
  123. }

Tags: PHP中奖概率算法 PHP大转盘

分享到: