红包算法

来源:互联网 发布:supfire神火官方淘宝 编辑:程序博客网 时间:2024/04/29 11:06
min 最小金额max 最大金额total 剩余总金额num 剩余总人数
if (num == 1){   return total}
// 更新随机种子  
srand(time(NULL));
// 确定本次随机范围
LONG low = (total – (num-1) * max) < min ? min : total – (num-1) * max;LONG high = (total – (num-1) * max) > max ? max : (total – (num-1)*min);LONG ave = total / num > 1 ? total / num : 1;// 调整上限if (high > 2 * ave) high = 2 * ave;// 生成随机支LONG ram = random() % high;// 防止溢出if (ram < low) ram = low;if (ram > high) ram = high;return ram;

@算法二

 100元发10个红包,100元换算为分是10000,则这个随机数范围是1-9999,生成9个不重复的随机数并排序,假设为n1-n9,n0=0,n10=10000,则10个红包的钱分别是n1-n0…n10-n9,再换算为元

代码
$ cat split.php

    <?php    $packs = split_money(100, 10);    var_dump($packs);    function split_money($money, $count) {      $money *= 100;      $list = array(0);      for ($i = 1; $i < $count; ++$i) {        while(in_array($r = mt_rand(1, $money), $list));        $list[] = $r;      }      sort($list);      $list[] = $money;      $packs = array();      for ($i = 0; $i < $count; ++$i)        $packs[] = ($list[$i + 1] – $list[$i]) / 100;      return $packs;    }    array(10) {      [0] =>      double(23.09)      [1] =>      double(33.62)      [2] =>      double(0.71)      [3] =>      double(19.3)      [4] =>      double(0.24)      [5] =>      double(0.47)      [6] =>      double(5.52)      [7] =>      double(2.32)      [8] =>      double(5.47)      [9] =>      double(9.26)    }
0 0