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

 PHP进阶  2019-12-29  admin  2640  3564

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 redis 分布式锁

Redis 分布式锁是一种使用 Redis 数据库来实现的同步机制,用于在分布式系统中保证多个进程或线程对共享资源的互斥访问。Redis 分布式锁的基本原理是使用 Redis 的 SETNX 命令来尝试设置一个键,如果这个键不存在,那么获取锁成功,否则获取锁失败。获取锁成功后,需要设置锁的过期时间,以防止锁被永久占用。释放锁时,需要删除这个键。Redis 分布式锁有一些优点和缺点:优点:Redis

UPX 是一个免费的、可移植的、可扩展的、高性能的可执行打包程序,适用于多种可执行格式

UPX 是一个免费的、可移植的、可扩展的、高性能的可执行打包程序,适用于多种可执行格式

php字符串压缩方法

php字符串压缩方法

PHP付钱找钱算法

PHP付钱找钱算法