当前位置:首页 > PHP

php实现红包算法

2026-02-15 13:01:39PHP

红包算法实现思路

红包算法的核心在于公平性和随机性,常见的有固定金额和随机金额两种模式。以下介绍几种常见的红包算法实现方法。

固定金额红包

固定金额红包是指每个红包的金额相同,实现较为简单。

php实现红包算法

function fixedRedPacket($totalAmount, $totalPeople) {
    if ($totalPeople <= 0) {
        return [];
    }
    $eachAmount = $totalAmount / $totalPeople;
    return array_fill(0, $totalPeople, $eachAmount);
}

随机金额红包(普通版)

随机金额红包需要保证每个人至少分到一定金额,且总金额等于预设值。

php实现红包算法

function randomRedPacket($totalAmount, $totalPeople) {
    if ($totalPeople <= 0) {
        return [];
    }
    $result = [];
    $remainingAmount = $totalAmount;
    $remainingPeople = $totalPeople;

    for ($i = 0; $i < $totalPeople - 1; $i++) {
        $max = $remainingAmount - $remainingPeople + 1;
        $money = mt_rand(1, $max * 100) / 100;
        $result[] = $money;
        $remainingAmount -= $money;
        $remainingPeople--;
    }
    $result[] = $remainingAmount;
    shuffle($result);
    return $result;
}

二倍均值法

二倍均值法是一种更公平的随机红包算法,保证每次随机金额在合理范围内。

function doubleAverageRedPacket($totalAmount, $totalPeople) {
    if ($totalPeople <= 0) {
        return [];
    }
    $result = [];
    $remainingAmount = $totalAmount;
    $remainingPeople = $totalPeople;

    for ($i = 0; $i < $totalPeople - 1; $i++) {
        $avg = $remainingAmount / $remainingPeople * 2;
        $money = mt_rand(1, $avg * 100) / 100;
        $result[] = $money;
        $remainingAmount -= $money;
        $remainingPeople--;
    }
    $result[] = $remainingAmount;
    shuffle($result);
    return $result;
}

线段切割法

线段切割法将总金额视为一条线段,随机选择分割点生成红包金额。

function lineCutRedPacket($totalAmount, $totalPeople) {
    if ($totalPeople <= 0) {
        return [];
    }
    $points = [];
    for ($i = 0; $i < $totalPeople - 1; $i++) {
        $points[] = mt_rand(1, $totalAmount * 100) / 100;
    }
    sort($points);
    $result = [];
    $prev = 0;
    foreach ($points as $point) {
        $result[] = $point - $prev;
        $prev = $point;
    }
    $result[] = $totalAmount - $prev;
    shuffle($result);
    return $result;
}

注意事项

  • 所有红包算法需保证总金额与预设值一致,避免浮点数精度问题。
  • 随机红包算法需确保每个人至少分到0.01元。
  • 可根据实际需求调整随机范围和分配策略。

标签: 红包算法
分享给朋友:

相关文章

js实现基数算法

js实现基数算法

基数排序(Radix Sort)简介 基数排序是一种非比较型整数排序算法,通过逐位分配和收集实现排序。适用于整数或固定格式字符串,时间复杂度为O(nk),其中n是元素数量,k是数字位数。 实…

js实现24点算法

js实现24点算法

24点算法简介 24点游戏的目标是通过加、减、乘、除四则运算,将4个数字组合成结果为24的表达式。以下是基于JavaScript的实现方法。 基本思路 排列组合:生成所有可能的数字排列顺序。 运…

js实现算法

js实现算法

JavaScript 实现常见算法的方法 排序算法 快速排序的实现: function quickSort(arr) { if (arr.length <= 1) return arr;…

js回文算法实现

js回文算法实现

回文算法的实现方法 方法一:使用字符串反转 将字符串反转后与原字符串比较,若相同则为回文。 function isPalindrome(str) { const reversedStr = st…

vue实现点击红包雨

vue实现点击红包雨

实现红包雨效果的步骤 准备工作 确保项目中已安装Vue.js,推荐使用Vue 3版本。创建一个新的Vue组件用于实现红包雨效果。 模板结构 在模板部分定义一个容器元素,用于承载下落的红包元素。红包可…

排序算法 php实现

排序算法 php实现

以下是在PHP中实现常见排序算法的几种方法,每种算法均附上代码示例和简要说明: 冒泡排序 通过重复比较相邻元素并交换位置完成排序,时间复杂度为O(n²)。 function bubbleSort(…