代码 PHP 微信红包算法

2024-11-17 22:45:34 +0800 CST views 1067

微信红包算法

功能概述

该函数 lineSegmentOptimize 用于模拟微信红包的分配算法。它将一个固定金额的红包分成指定数量的随机份额,并确保每个份额的金额为整数,同时总金额与原红包金额一致。

代码分析

  1. 输入参数

    • $Moneys: 红包总金额。
    • $userNums: 红包分配的总人数。
    • $isEveryHave: 可选参数,表示是否每个人至少有一个单位的金额,默认为 1
  2. 逻辑流程

    • 进行输入参数的合法性校验。
    • 根据 $isEveryHave 的值决定切割点的范围。
    • 如果 userNums 为 1,则直接将全部金额分给一个人。
    • 使用 array_rand 从数组中随机取出切割点,将红包划分为多个区间。
    • 返回划分后的红包金额数组。

优化后的代码

<?php

function lineSegmentOptimize($Moneys, $userNums, $isEveryHave = 1)
{
    // 参数合法性检查
    if ($Moneys <= 0 || $userNums <= 0) {
        return ['code' => -3, 'msg' => '红包金额或拆红包总人数不合法'];
    }
    if ($isEveryHave && $userNums > $Moneys) {
        return ['code' => -4, 'msg' => '红包数量不足'];
    }

    // 单个红包的特殊情况处理
    if ($userNums == 1) {
        return ['code' => 0, 'msg' => 'success', 'redbag' => [$Moneys]];
    }

    // 初始化变量
    $userMoney = [];
    $MoneysArr = $isEveryHave ? array_fill(1, $Moneys - 1, 0) : array_fill(0, $Moneys + 1, 0);

    // 生成切割点
    $cutPoints = array_rand($MoneysArr, $userNums - 1);
    sort($cutPoints);

    // 根据切割点划分红包金额
    $lastVal = 0;
    foreach ($cutPoints as $randPoint) {
        $userMoney[] = $randPoint - $lastVal;
        $lastVal = $randPoint;
    }
    $userMoney[] = $Moneys - $lastVal;

    return ['code' => 0, 'msg' => 'success', 'redbag' => $userMoney];
}

代码功能说明

  1. 参数合法性检查

    • 确保红包总金额和人数都是正数。
    • 如果选择了每个人至少有一个单位的金额且人数超过总金额,返回错误信息。
  2. 特殊情况处理

    • 如果红包仅分配给一个人,直接返回总金额。
  3. 随机切割点的生成

    • 使用 array_rand 生成多个不重复的随机切割点,并确保区间包括首尾。
  4. 红包金额的计算

    • 通过切割点的差值将红包划分成多个部分,最后返回一个包含各部分金额的数组。

使用方法

调用函数时,传入红包总金额 $Moneys,分配的人数 $userNums,以及可选的 isEveryHave 参数(默认为 1,即每人至少有一份)。例如:

$result = lineSegmentOptimize(100, 5);
print_r($result);

总结

该算法通过随机生成切割点将红包总金额划分为多个部分,并确保划分后的金额分布均匀且总和与原红包金额一致。代码经过优化后,结构更清晰,逻辑更合理,适合实际应用场景中的红包分配需求。

复制全文 生成海报 编程 算法 PHP

推荐文章

PHP来做一个短网址(短链接)服务
2024-11-17 22:18:37 +0800 CST
liunx宝塔php7.3安装mongodb扩展
2024-11-17 11:56:14 +0800 CST
Vue中如何使用API发送异步请求?
2024-11-19 10:04:27 +0800 CST
Golang实现的交互Shell
2024-11-19 04:05:20 +0800 CST
robots.txt 的写法及用法
2024-11-19 01:44:21 +0800 CST
2024年公司官方网站建设费用解析
2024-11-18 20:21:19 +0800 CST
deepcopy一个Go语言的深拷贝工具库
2024-11-18 18:17:40 +0800 CST
对多个数组或多维数组进行排序
2024-11-17 05:10:28 +0800 CST
55个常用的JavaScript代码段
2024-11-18 22:38:45 +0800 CST
内网穿透技术详解与工具对比
2025-04-01 22:12:02 +0800 CST
Grid布局的简洁性和高效性
2024-11-18 03:48:02 +0800 CST
详解 Nginx 的 `sub_filter` 指令
2024-11-19 02:09:49 +0800 CST
pycm:一个强大的混淆矩阵库
2024-11-18 16:17:54 +0800 CST
Vue3中如何使用计算属性?
2024-11-18 10:18:12 +0800 CST
Golang在整洁架构中优雅使用事务
2024-11-18 19:26:04 +0800 CST
2024年微信小程序开发价格概览
2024-11-19 06:40:52 +0800 CST
JavaScript 的模板字符串
2024-11-18 22:44:09 +0800 CST
基于Flask实现后台权限管理系统
2024-11-19 09:53:09 +0800 CST
在Vue3中实现代码分割和懒加载
2024-11-17 06:18:00 +0800 CST
php常用的正则表达式
2024-11-19 03:48:35 +0800 CST
程序员茄子在线接单