首页 > 开发 > PHP > 正文

PHP抽奖算法程序代码分享

2024-05-04 23:39:27
字体:
来源:转载
供稿:网友

这篇文章主要分享了PHP抽奖算法程序设计,抽奖在日常生活中大家都会接触到,用php如何实现抽奖算法,需要了解的朋友可以参考一下

抽奖算法需要满足的需求如下:

1.可以控制中奖的概率

2.具有随机性

3.最好可以控制奖品的数量

4.根据用户ID或者ip、手机号、QQ号等条件限制抽奖次数

初期就这些需求,然后根据网上的资料,采用了一种阶段式抽取的方法,大家下面看一下整体的程序:

该程序是在ThinkPHP框架下完成的,使用了一些框架自带的类库和函数,下面我会逐一进行说明,控制器部分:

代码如下

 

 
  1. <?php 
  2.  
  3. /** 
  4.  
  5. * 
  6. * @lanfengye <zibin_5257@163.com> 
  7. */ 
  8. class ChoujiangAction extends Action { 
  9. //抽奖的开始时间 
  10. var $begin_time="2012-12-25 14:00:00"//开始时间 0-不限制 
  11. //抽奖的结束时间 
  12. var $stop_time="0"//结束时间 0-不限制 
  13.  
  14. //本次抽奖的奖项信息,必须按照从大到小的顺序进行填写,id为奖次,prize为中奖信息,v为中奖概率,num为奖品数量 
  15. //需要注意的是,该处也必须包含不中奖的信息,概率从小到大进行排序 
  16. var $prize_arr = array( 
  17. '0' => array('id' => 1, 'prize' => '44元购买1G/年空间''v' => 1,'num'=>1), 
  18. '1' => array('id' => 2, 'prize' => '55元购买1G/年空间''v' => 2,'num'=>2), 
  19. '2' => array('id' => 3, 'prize' => '66元购买1G/年空间''v' => 5,'num'=>2), 
  20. '3' => array('id' => 4, 'prize' => '77元购买1G/年空间''v' => 10,'num'=>3), 
  21. '4' => array('id' => 5, 'prize' => '88元购买1G/年空间''v' => 15,'num'=>4), 
  22. '5' => array('id' => 6, 'prize' => '99元购买1G/年空间''v' => 67,'num'=>10), 
  23. ); 
  24.  
  25.  
  26. //首页显示方法  
  27. public function index(){ 
  28. //连接数据库,去获取本次中奖的人员名单 
  29. $Choujiang=M('Choujiang'); 
  30. $this->assign('list', $Choujiang->where("rid>0")->order('id desc')->select()); 
  31. unset($Choujiang); 
  32.  
  33. //在首页中显示抽奖的开始时间 
  34. $this->assign('begin_time',$this->begin_time); 
  35.  
  36. $this->display(); 
  37.  
  38.  
  39.  
  40. /** 
  41. * 生成中奖信息,ajax进行请求该方法,需要客户填写QQ号码 
  42. */ 
  43. public function make() { 
  44. $qq_no= trim($_POST['qq_no']); 
  45. import('ORG.Util.Input'); 
  46. $qq_no=Input::getVar($qq_no); 
  47.  
  48. if(empty($qq_no)){ 
  49. $this->ajaxReturn(1, '请正确填写QQ号码!'); 
  50. exit; 
  51.  
  52. if(!empty($this->begin_time) && time()<strtotime($this->begin_time)){ 
  53. $this->ajaxReturn(1, '抽奖还没有开始,开始时间为:'.$this->begin_time); 
  54. exit; 
  55.  
  56. if(!empty($this->stop_time) && time()>strtotime($this->stop_time)){ 
  57. $this->ajaxReturn(1, '本次抽奖已经结束,结束时间为:'.$this->stop_time); 
  58. exit; 
  59.  
  60. //获取奖项信息数组,来源于私有成员 
  61. $prize_arr= $this->prize_arr; 
  62.  
  63. foreach ($prize_arr as $key => $val) { 
  64. $arr[$val['id']] = $val['v']; 
  65. //$rid中奖的序列号码 
  66. $rid = $this->get_rand($arr); //根据概率获取奖项id 
  67.  
  68. $str = $prize_arr[$rid - 1]['prize']; //中奖项  
  69.  
  70. $Choujiang=M('Choujiang'); 
  71.  
  72. //从数据库中获取特定QQ号已经参加抽奖的次数,如果大于等于3则提示次数用完 
  73. if($Choujiang->where("qq_no='{$qq_no}'")->count()>=3){ 
  74. $str='您3次抽奖机会已经用完!'
  75. $rid=0; 
  76. //从数据库中获取特定奖项序号的次数,大于等于设置的最大次数则提示奖品被抽完,如果需要一直中最后一个纪念奖,则修改该处即可 
  77. }elseif ($Choujiang->where("rid={$rid}")->count()>=$prize_arr[$rid-1]['num']) { 
  78. $str='很抱歉,您所抽中的奖项已经中完!'
  79. $rid=0; 
  80. //生成一个用户抽奖的数据,用来记录到数据库 
  81. $data=array( 
  82. 'rid'=>$rid, 
  83. 'pop'=>$str, 
  84. 'qq_no'=>$qq_no, 
  85. 'input_time'=>time() 
  86. ); 
  87. //将用户抽奖信息数组写入数据库 
  88.  
  89. $Choujiang->add($data); 
  90. unset($Choujiang); 
  91.  
  92. //ajax返回信息 
  93. $this->ajaxReturn(1, $str); 
  94.  
  95. /** 
  96. * 根据概率获取中奖号码 
  97. */ 
  98. private function get_rand($proArr) { 
  99. $result = ''
  100. //概率数组的总概率精度  
  101. $proSum = array_sum($proArr); 
  102. //概率数组循环  
  103. foreach ($proArr as $key => $proCur) { 
  104. $randNum = mt_rand(1, $proSum); 
  105. if ($randNum <= $proCur) { 
  106. $result = $key; 
  107. break
  108. else { 
  109. $proSum -= $proCur; 
  110. unset($proArr); 
  111. return $result; 
  112.  
  113. }  
  114. ?> 

该算法简单使用,并发访问性能非常好,稍加改动就可以用于各种场合,结合用户登录等信息可有效控制每个人的抽奖次数。将开始和结束之间更改为数组,就可以完善成为每天特定时间抽奖的程序。

希望大家可以结合有关php抽奖程序的文章进行深入学习,更好的掌握这门语言的应用技巧。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表