allocator.php 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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 = doubleval($total / $num);
  14. return intval($avg * 2 + 0.5);
  15. }
  16. private function get_minamount($total,$num)
  17. {
  18. $avg = doubleval($total / $num);
  19. $avg = $avg / 10;
  20. $avg = intval($avg + 0.5);
  21. return $avg;
  22. }
  23. public function separate_money($min_amount,$total_amount,$total_num,&$min_val,&$max_val)
  24. {
  25. $min_amount = intval(doubleval($min_amount) * 100 + 0.5);
  26. $base_amount = $min_amount;
  27. $num = intval($total_num);
  28. $ret = array();
  29. for ($i = 0; $i < $num; $i++) {
  30. array_push($ret,$base_amount);
  31. }
  32. $total_amount = intval(intval(doubleval($total_amount) * 100 + 0.5) - $num * $base_amount);
  33. $min_amount = $this->get_minamount($total_amount,$num);
  34. if($min_amount > 0)
  35. {
  36. foreach($ret as &$val) {
  37. $val += $min_amount;
  38. }
  39. $total_amount -= $min_amount * $num;
  40. }
  41. $max_val = 0;
  42. $max_amount = $this->get_maxamount($total_amount,$num);
  43. for ($i = 0; $i < $num && $total_amount > 0;)
  44. {
  45. $amount = intval(mt_rand(0, $max_amount));
  46. $amount = $amount > $total_amount ? $total_amount : $amount;
  47. $ret[$i] += $amount;
  48. $total_amount -= $amount;
  49. $max_val = $ret[$i] > $max_val ? $ret[$i] : $max_val;
  50. if($i == $num -1) {
  51. $i = 0;
  52. } else {
  53. $i++;
  54. }
  55. }
  56. $max_val = doubleval($max_val) / 100;
  57. $min_val = $ret[0];
  58. foreach ($ret as &$val) {
  59. $min_val = $min_val > $val ? $val : $min_val;
  60. $val = doubleval($val) / 100;
  61. }
  62. $min_val = doubleval($min_val) / 100;
  63. for($index = 0; $index < $num - 1; $index++) {
  64. $pos_a = mt_rand(0, $num - 1);
  65. $pos_b = mt_rand(0, $num - 1);
  66. $tmp = $ret[$pos_a];
  67. $ret[$pos_a] = $ret[$pos_b];
  68. $ret[$pos_b] = $tmp;
  69. }
  70. return $ret;
  71. }
  72. }