免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1735 | 回复: 1
打印 上一主题 下一主题

随机抽奖php [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-30 09:44 |只看该作者 |倒序浏览
按照设定的概率,得到随机抽奖的结果。
  1. <?php
  2. /**
  3. * 抽奖工具
  4. */
  5. class lottery_tool {

  6.     protected static $awardsArr;
  7.     protected static $proField = 'probability';
  8.     protected static $proSum = 0;
  9.     protected static $checkAward = false;

  10.     const SUCCESS_CODE = 0;
  11.     const FAIL_CODE = -1;

  12.     //检查抽奖数据
  13.     protected static function checkAwards(){

  14.         if (!is_array(self::$awardsArr) || empty(self::$awardsArr)) {
  15.             return self::$checkAward = false;
  16.         }
  17.          
  18.         self::$proSum = 0;

  19.         foreach (self::$awardsArr as $_key => $award) {
  20.             self::$proSum += $award[self::$proField];
  21.         }

  22.         if (empty(self::$proSum)) {
  23.             return self::$checkAward = false;
  24.         }

  25.         return self::$checkAward = true;
  26.     }
  27.   
  28.     protected static function successRoll($rollKey){
  29.         return array('code' => self::SUCCESS_CODE, 'roll_key' => $rollKey, 'msg' => 'roll success');
  30.     }

  31.     protected static function failRoll($msg = 'roll fail'){
  32.         return array('code' => self::FAIL_CODE, 'msg' => $msg );
  33.     }

  34.     //抽奖
  35.     public static function roll () {

  36.         if (false == self::$checkAward) {
  37.             return self::failRoll('awards data is not the right format!');
  38.         }

  39.         $result = mt_rand(0, self::$proSum);
  40.         $proValue = 0;

  41.         foreach (self::$awardsArr as $_key => $value) {
  42.             $proValue += $value[self::$proField];
  43.             if ($result <= $proValue) {
  44.                 return self::successRoll($_key);
  45.             }
  46.         }
  47.         return self::failRoll('wrong');
  48.     }

  49.     //改变概率字段名
  50.     public static function setProField($field = null) {
  51.         if (!empty($field)) {
  52.             self::$proField = $field;
  53.         }
  54.     }

  55.     //设置奖品
  56.     public static function setAwards($awards){
  57.         self::$awardsArr = $awards;
  58.         self::checkAwards();
  59.     }
  60. }
复制代码
forexample
  1. $awards = array(
  2.     '0' => array('pro' => 15, 'info' => '15%的可能性'),
  3.     '1' => array('pro' => 25, 'info' => '25%的可能性'),
  4.     '2' => array('pro' => 40, 'info' => '40%的可能性'),
  5.     '3' => array('pro' => 20, 'info' => '20%的可能性'),
  6.     );

  7. lottery_tool::setProField('pro');
  8. lottery_tool::setAwards($awards);

  9. $result = array();

  10. for ($i = 10000; $i --;) {
  11.     $result[] = lottery_tool::roll();
  12. }

  13. foreach ($result as $key => $value) {
  14.     $awards[$value['roll_key']]['num'] ++;
  15. }

  16. echo '<pre>';
  17. var_dump($awards);
  18. //结果:
  19. array
  20.   0 =>
  21.     array
  22.       'pro' => int 15
  23.       'info' => string '15%的可能性' (length=15)
  24.       'num' => int 1596
  25.   1 =>
  26.     array
  27.       'pro' => int 25
  28.       'info' => string '25%的可能性' (length=15)
  29.       'num' => int 2484
  30.   2 =>
  31.     array
  32.       'pro' => int 40
  33.       'info' => string '40%的可能性' (length=15)
  34.       'num' => int 3939
  35.   3 =>
  36.     array
  37.       'pro' => int 20
  38.       'info' => string '20%的可能性' (length=15)
  39.       'num' => int 1981
复制代码

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
2 [报告]
发表于 2015-07-10 10:17 |只看该作者
不错。其实用VBA实现更好。方便。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP