php根据总金额生成指定个数的随机红包,红包算法

 PHP进阶  2019-12-29  admin  323  436

php根据总金额生成指定个数的随机红包,红包算法

/**
 * 根据总金额生成指定个数的随机红包
 * 1、 微信红包, 每人最少分得1分钱
 * 2、 每人分得到的金额是随机分配的
 * 3、 每次生成红包就生成了对应领取红包的结果
 * 生成随机红包
 * Class redPacket
 */
class redPacket
{
    //总金额
    private $total = 0;
    //红包数量
    private $amount = 0;
    //最小红包金额
    private $min = 0.01;

    public function __construct($total, $amount, $min)
    {
        $this->total = $total;
        $this->amount = $amount;
        $this->min = $min;
    }

    /**
     * @return bool
     */
    public function getPacket()
    {

        $total = $this->total;
        $amount = $this->amount;
        $min = $this->min;
        if ($amount * $min > $total) {
            return false;
        }
        $money = 0;
        for ($i = 1; $i < $amount; $i++) {
            $safe_total = ($total - ($amount - $i) * $min) / ($amount - $i);//随机安全上限
            if ($min < $safe_total) {
                $money = mt_rand($min * 100, $safe_total * 100) / 100;
            } else {
                $money = $min;
            }

            $total = $total - $money;

            $redPacket[] = [
                'money' => $money,
                'balance' => $total,
            ];
        }
        //最后一个红包,
        $redPacket[] = [
            'money' => $total,
            'balance' => 0,
        ];

        return $redPacket;
    }

}

使用方法

$total = 12.12;//红包总金额
$amount = 11;// 分成11个红包, 支持11人随机领取
$min = 0.01;//每个人最少能收到0.01元
$redPacket = new redPacket($total, $amount, $min);
$result = $redPacket->getPacket();
foreach ($result as $key => $val) {
    echo '第' . ($key + 1) . '个红包: ' . $val['money'] . ' 元, 余额: ' . $val['balance'] . ' 元' . "\n";
}
echo array_sum(array_column($result, 'money')); //12.12

结果

第1个红包: 0.61 元, 余额: 11.51 元
第2个红包: 0.13 元, 余额: 11.38 元
第3个红包: 0.25 元, 余额: 11.13 元
第4个红包: 0.69 元, 余额: 10.44 元
第5个红包: 1.55 元, 余额: 8.89 元
第6个红包: 0.94 元, 余额: 7.95 元
第7个红包: 1.47 元, 余额: 6.48 元
第8个红包: 0.2 元, 余额: 6.28 元
第9个红包: 1.87 元, 余额: 4.41 元
第10个红包: 2.21 元, 余额: 2.2 元
第11个红包: 2.2 元, 余额: 0 元


相关推荐


php中奖概率算法,刮刮卡,大转盘等抽奖算法

php中奖概率算法,刮刮卡,大转盘等抽奖算法/** *经典的概率算法, *$arrPrize是一个预先设置的奖品数组, *假设数组为:array(100,200,300,400), *开始是从1,1000这个概率范围内筛选第一个数是否在出现概率范围之内, *如果不在,则将概率空间的值减去刚刚的那个数字的概率空间, *在本例当中就是减去100,也就是说第二个数是在1,900这个范围内筛选

小米开源的数据库SQL性能分析工具SOAR,windows版安装使用

SOARSOAR(SQL Optimizer And Rewriter)是一个对SQL进行优化和改写的自动化工具。 由小米人工智能与云平台的数据库团队开发与维护。功能特点跨平台支持(支持Linux, Mac环境,Windows环境理论上也支持,不过未全面测试)目前只支持 MySQL 语法族协议的SQL优化支持基于启发式算法的语句优化支持复杂查询的多列索引优化(UPDATE, INSERT, DEL

php 所有字符串相关函数

php 所有字符串相关函数addcslashes( )以 C 语言风格使用反斜线转义字符串中的字符addslashes( )使用反斜线引用字符串bin2hex( )函数把包含数据的二进制字符串转换为十六进制值chop( )rtrim 的别名chr( )返回指定的字符chunk_split( )将字符串分割成小块convert_cyr_string( )将字符由一种 Cyrillic 字符转换成另一

php 所有数组相关的函数

php 所有数组相关的函数array_change_key_case( )将数组中的所有键名修改为全大写或小写array_chunk( )将一个数组分割成多个array_column( )返回数组中指定的一列array_combine( )创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值array_count_values( )统计数组中所有的值array_diff_assoc( )