allocator.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 16/6/21
  6. * Time: 下午4:01
  7. */
  8. namespace bonus;
  9. class allocator
  10. {
  11. private function get_maxamount($total,$num)
  12. {
  13. $avg = floatval($total / $num);
  14. return intval($avg * 2 + 0.5);
  15. }
  16. private function get_minamount($total,$num)
  17. {
  18. $avg = floatval($total / $num);
  19. $avg = $avg / 10;
  20. $avg = intval($avg + 0.5);
  21. return $avg;
  22. }
  23. /**
  24. * @param $paramer
  25. */
  26. public function separate_money($min_amount,$total_amount,$total_num,&$min_val,&$max_val)
  27. {
  28. $min_amount = intval(floatval($min_amount) * 100 + 0.5);
  29. $base_amount = $min_amount;
  30. $num = intval($total_num);
  31. $ret = array();
  32. for ($i = 0; $i < $num; $i++) {
  33. array_push($ret,$base_amount);
  34. }
  35. $total_amount = intval(intval(floatval($total_amount) * 100 + 0.5) - $num * $base_amount);
  36. $min_amount = $this->get_minamount($total_amount,$num);
  37. if($min_amount > 0)
  38. {
  39. foreach($ret as &$val) {
  40. $val += $min_amount;
  41. }
  42. $total_amount -= $min_amount * $num;
  43. }
  44. $max_val = 0;
  45. $max_amount = $this->get_maxamount($total_amount,$num);
  46. for ($i = 0; $i < $num && $total_amount > 0;)
  47. {
  48. $amount = intval(mt_rand(0, $max_amount));
  49. $amount = $amount > $total_amount ? $total_amount : $amount;
  50. $ret[$i] += $amount;
  51. $total_amount -= $amount;
  52. $max_val = $ret[$i] > $max_val ? $ret[$i] : $max_val;
  53. if($i == $num -1) {
  54. $i = 0;
  55. } else {
  56. $i++;
  57. }
  58. }
  59. $max_val = floatval($max_val) / 100;
  60. $min_val = $ret[0];
  61. foreach ($ret as &$val) {
  62. $min_val = $min_val > $val ? $val : $min_val;
  63. $val = floatval($val) / 100;
  64. }
  65. $min_val = floatval($min_val) / 100;
  66. for($index = 0; $index < $num - 1; $index++) {
  67. $pos_a = mt_rand(0, $num - 1);
  68. $pos_b = mt_rand(0, $num - 1);
  69. $tmp = $ret[$pos_a];
  70. $ret[$pos_a] = $ret[$pos_b];
  71. $ret[$pos_b] = $tmp;
  72. }
  73. return $ret;
  74. }
  75. }