码迷,mamicode.com
首页 > 编程语言 > 详细

红包算法

时间:2017-07-27 12:47:31      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:key   count   cti   amp   div   echo   red   function   i++   

<?php
$r = redEnvelope(100, 10, 12, 6);
echo array_sum($r); //校验结果
print_r($r); //查看分布
 
function redEnvelope($sum, $num, $max, $min){
  $result = array_fill(0, $num, $min);
  $loop = $sum - $num * $min;
  $i = 0;
  while($loop) {
    $randNum = mt_rand(1, min($loop, $max - $min));
    if($randNum && $result[$i] + $randNum <= $max) {
      $result[$i] += $randNum;
      $loop -= $randNum;
    }
    $i = ($i + 1) % $num;
  } //分配结束
  //$max 至多出现一次
  $m = array_keys($result, max($result));
  if(count($m) > 1 && $result[$m[0]] == $max) {
    for($i=1; $i<count($m); $i++) {
      $n = array_keys($result, min($result));
      $result[$m[$i]]--;
      $result[$n[0]]++;
    }
  }
  //$min 至多出现一次
  $m = array_keys($result, min($result));
  if(count($m) > 1 && $result[$m[0]] == $min) {
    for($i=1; $i<count($m); $i++) {
      $n = array_keys($result, $min + 2);
      $result[$m[$i]]++;
      $result[$n[0]]--;
    }
  }
  return $result;
}

红包算法

标签:key   count   cti   amp   div   echo   red   function   i++   

原文地址:http://www.cnblogs.com/csjoz/p/7244076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!