当前位置:Gxlcms > PHP教程 > 一个简单的抽奖测试原型

一个简单的抽奖测试原型

时间:2021-07-01 10:21:17 帮助过:16人阅读

业务需求,所以做了一个简单的原型测试,功能的主要需求是:用户账户内金额越高的用户中奖的机率就越大。
此脚本只能在命令行下使用,使用示例:
php lucky.php 100

  1. /**
  2. * 抽奖程序
  3. *
  4. * @File: lucky.php
  5. * @Author: zzxworld
  6. * @Email: zzxworld@gmail.com
  7. * @Date: 2012-05-09
  8. */
  9. $timer = microtime(true);
  10. /** 手动配置的参数 **/
  11. # 奖池大小
  12. $lucky_size = 1000;
  13. # 最高金额用户的中奖机率,不能超过奖池大小
  14. $star_user_rate = 100;
  15. # 一等奖奖金
  16. $lucky_first = 100;
  17. # 二等奖奖金
  18. $lucky_second = 50;
  19. # 三等奖奖金
  20. $lucky_third = 25;
  21. # 普通奖最大金额
  22. $lucky_normal_max = 10;
  23. # 普通奖最小金额
  24. $lucky_normal_min = 1;
  25. /** 自动从系统取值的参数 **/
  26. # 奖金总金额
  27. $lucky_amount = 578;
  28. # 拥有最多资产的用户的账户金额
  29. $star_user_amount = 134;
  30. # 当前用户金额
  31. $user_amount = isset($argv[1]) ? intval($argv[1]) : 0;
  32. if ($user_amount < 1) {
  33. die('请在命令后面设置一个用户金额.' . chr(10));
  34. }
  35. # 计算当前用户中奖机率
  36. $user_rate = $star_user_rate/$lucky_size/$star_user_amount*$user_amount;
  37. # 根据中奖机率计算奖金个数
  38. $lucky_num = intval($user_rate * $lucky_size);
  39. # 初始化奖池
  40. $lucky_pool = array_fill(0, $lucky_size, 0);
  41. # 中奖机率小于1的调整为1
  42. if ($lucky_num < 1) {
  43. $lucky_num = 1;
  44. }
  45. # 安排奖池中的奖项
  46. $lucky_items = array('first', 'second', 'third', 'normal');
  47. $lucky_num += 3;
  48. # 按奖金总额去除一,二,三等奖项
  49. if ($lucky_amount < $lucky_first) {
  50. $lucky_num -= 1;
  51. unset($lucky_items['first']);
  52. }
  53. if ($lucky_amount < $lucky_second) {
  54. $lucky_num -= 1;
  55. unset($lucky_items['second']);
  56. }
  57. if ($lucky_amount < $lucky_third) {
  58. $lucky_num -= 1;
  59. unset($lucky_items['third']);
  60. }
  61. # 在奖池中随机生成奖项
  62. foreach(array_rand($lucky_pool, $lucky_num) as $key) {
  63. $name = $lucky_items[array_rand($lucky_items)];
  64. if (!isset($create_lucky_first) && $name == 'first') {
  65. $lucky_pool[$key] = $lucky_first;
  66. $create_lucky_first = true;
  67. continue;
  68. }
  69. if (!isset($create_lucky_second) && $name == 'second') {
  70. $lucky_pool[$key] = $lucky_second;
  71. $create_lucky_second = true;
  72. continue;
  73. }
  74. if (!isset($create_lucky_third) && $name == 'third') {
  75. $lucky_pool[$key] = $lucky_third;
  76. $create_lucky_third = true;
  77. continue;
  78. }
  79. if ($name == 'normal') {
  80. $lucky_pool[$key] = rand($lucky_normal_min, $lucky_normal_max);
  81. }
  82. }
  83. # 抽奖
  84. $result = $lucky_pool[rand(0, $lucky_size)];
  85. echo '奖池大小:' . $lucky_size . chr(10);
  86. echo '奖金总金额:' . $lucky_amount . chr(10);
  87. echo '一等奖奖金:' . $lucky_first . chr(10);
  88. echo '二等奖奖金:' . $lucky_second . chr(10);
  89. echo '三等奖奖金:' . $lucky_third . chr(10);
  90. echo '普通奖奖金:' . $lucky_normal_min . ' - ' . $lucky_normal_max . chr(10);
  91. echo '明星用户资金总额:' . $star_user_amount . chr(10);
  92. echo '明星用户中奖机率:' . ($star_user_rate/$lucky_size) . chr(10) . chr(10);
  93. echo '当前用户资金总额:' . $user_amount . chr(10);
  94. echo '当前用户中奖机率:' . $user_rate . chr(10);
  95. echo '当前用户奖池中的奖项:';
  96. foreach($lucky_items as $name) {
  97. switch($name) {
  98. case 'first':
  99. echo '一等奖(1),';
  100. $lucky_num--;
  101. break;
  102. case 'second':
  103. echo '二等奖(1),';
  104. $lucky_num--;
  105. break;
  106. case 'third':
  107. echo '三等奖(1),';
  108. $lucky_num--;
  109. break;
  110. case 'normal':
  111. echo '普通奖(' . $lucky_num . ')';
  112. break;
  113. }
  114. }
  115. echo chr(10);
  116. echo '当前用户抽奖结果:';
  117. if ($result == $lucky_first) {
  118. echo '一等奖 ' . $result . '元';
  119. } elseif($result == $lucky_second) {
  120. echo '二等奖 ' . $result . '元';
  121. } elseif($result == $lucky_third) {
  122. echo '三等奖 ' . $result . '元';
  123. } elseif($result >= $lucky_normal_min && $result <= $lucky_normal_max) {
  124. echo '普通奖 ' . $result . '元';
  125. } else {
  126. echo '没有中奖';
  127. }
  128. echo chr(10);
  129. echo chr(10);
  130. echo '执行耗时:' . (microtime(true) - $timer) . '秒' . chr(10);

人气教程排行