红包算法

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值