红包算法

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)
    }
红包算法有多种,下面详细介绍几种常见的算法: 1. **PHP结合Redis的拆红包算法**:该算法逻辑是传入红包总金额和拆分的数量,将分配好的金钱使用Redis队列方式存放,客户点击领取时从队列中出队,避免多抢,但未详细描述Redis部分的实现 [^1]。 2. **红包随机算法**: - **实时计算随机范围算法**:将随机金额控制在平均值的两倍以内。例如,将100元分给10个人,第一个人的随机范围是0.1~100/10*2即0.1~20,第二个人的随机范围为0.1~剩余金额/剩余人数9*2,以此类推。该算法的优点是每个人的金额波动不会大于平均金额的2倍,不会出现大金额,并且可以实时计算,点击开红包时通过后台实时计算,不占用内存 [^2]。 - **类似发行股票算法**:有n个人分总金额为m的红包,每个人在1~m之间随机抽取自己的股票数量personStock,计算出总股票数量totalStocks,每个人的金额 = 每股的价值*自己抽中的股票数量,每股的价值=总红包金额/总的股票数量,即m/totalStocks*personStock。该算法有较大的随机性,但总体趋于平均,可用于发红包阶段预先分好红包 [^2]。 3. **数据结构切割点算法**:当n个人一起抢总金额为m的红包时,做n - 1次随机运算确定n - 1个切割点,随机范围区间是[1, m - 1] ,因为最少分配1分钱 [^3]。 4. **微信红包拆分最大的红包法**:定义了一个类`CSendRadPacket`,包含计算红包、打印红包等功能,还定义了最大允许发10000元红包的常量 [^4]。 以下是实时计算随机范围算法的Python代码示例: ```python import random def split_red_envelope(total_amount, num_people): result = [] remaining_amount = total_amount remaining_people = num_people for i in range(num_people - 1): # 计算当前随机范围 max_amount = remaining_amount / remaining_people * 2 amount = random.uniform(0.01, max_amount) amount = round(amount, 2) result.append(amount) remaining_amount -= amount remaining_people -= 1 # 最后一个人拿走剩余金额 result.append(round(remaining_amount, 2)) return result # 示例:100元分给10个人 total = 100 num = 10 red_envelopes = split_red_envelope(total, num) print(red_envelopes) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值