国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP實現微信紅包拆分算法

Drummor / 1221人閱讀

算法為自創,非微信官方算法(僅供參考);如測出有問題,請及時反饋。感謝

原文:http://flc.ren/2018/04/701.html

CHANGELOG

2018-04-07

修復最后一個紅包輸出未保留2位數

修復領取的紅包金額低于最小紅包限制

handle();
 *      print_r($res);
 *
 * @author Flc <2018-04-06 20:09:53>
 * @see http://flc.ren | http://flc.io | https://github.com/flc1125
 */
class Coupon
{
    /**
     * 紅包金額
     *
     * @var float
     */
    protected $amount;

    /**
     * 紅包個數
     *
     * @var int
     */
    protected $num;

    /**
     * 領取的紅包最小金額
     *
     * @var float
     */
    protected $coupon_min;

    /**
     * 紅包分配結果
     *
     * @var array
     */
    protected $items = [];

    /**
     * 初始化
     *
     * @param float $amount     紅包金額(單位:元)最多保留2位小數
     * @param int   $num        紅包個數
     * @param float $coupon_min 每個至少領取的紅包金額
     */
    public function __construct($amount, $num = 1, $coupon_min = 0.01)
    {
        $this->amount = $amount;
        $this->num = $num;
        $this->coupon_min = $coupon_min;
    }

    /**
     * 處理返回
     *
     * @return array
     */
    public function handle()
    {
        // A. 驗證
        if ($this->amount < $validAmount = $this->coupon_min * $this->num) {
            throw new Exception("紅包總金額必須≥".$validAmount."元");
        }

        // B. 分配紅包
        $this->apportion();

        return [
            "items" => $this->items,
        ];
    }

    /**
     * 分配紅包
     */
    protected function apportion()
    {
        $num = $this->num;  // 剩余可分配的紅包個數
        $amount = $this->amount;  //剩余可領取的紅包金額

        while ($num >= 1) {
            // 剩余一個的時候,直接取剩余紅包
            if ($num == 1) {
                $coupon_amount = $this->decimal_number($amount);
            } else {
                $avg_amount = $this->decimal_number($amount / $num);  // 剩余的紅包的平均金額

                $coupon_amount = $this->decimal_number(
                    $this->calcCouponAmount($avg_amount, $amount, $num)
                );
            }

            $this->items[] = $coupon_amount; // 追加分配

            $amount -= $coupon_amount;
            --$num;
        }

        shuffle($this->items);  //隨機打亂
    }

    /**
     * 計算分配的紅包金額
     *
     * @param float $avg_amount 每次計算的平均金額
     * @param float $amount     剩余可領取金額
     * @param int   $num        剩余可領取的紅包個數
     *
     * @return float
     */
    protected function calcCouponAmount($avg_amount, $amount, $num)
    {
        // 如果平均金額小于等于最低金額,則直接返回最低金額
        if ($avg_amount <= $this->coupon_min) {
            return $this->coupon_min;
        }

        // 浮動計算
        $coupon_amount = $this->decimal_number($avg_amount * (1 + $this->apportionRandRatio()));

        // 如果低于最低金額或超過可領取的最大金額,則重新獲取
        if ($coupon_amount < $this->coupon_min
            || $coupon_amount > $this->calcCouponAmountMax($amount, $num)
        ) {
            return $this->calcCouponAmount($avg_amount, $amount, $num);
        }

        return $coupon_amount;
    }

    /**
     * 計算分配的紅包金額-可領取的最大金額
     *
     * @param float $amount
     * @param int   $num
     */
    protected function calcCouponAmountMax($amount, $num)
    {
        return $this->coupon_min + $amount - $num * $this->coupon_min;
    }

    /**
     * 紅包金額浮動比例
     */
    protected function apportionRandRatio()
    {
        // 60%機率獲取剩余平均值的大幅度紅包(可能正數、可能負數)
        if (rand(1, 100) <= 60) {
            return rand(-70, 70) / 100; // 上下幅度70%
        }

        return rand(-30, 30) / 100; // 其他情況,上下浮動30%;
    }

    /**
     * 格式化金額,保留2位
     *
     * @param float $amount
     *
     * @return float
     */
    protected function decimal_number($amount)
    {
        return sprintf("%01.2f", round($amount, 2));
    }
}

// 例子
$coupon = new Coupon(200, 5, 30);
$res = $coupon->handle();
print_r($res);

運行結果:http://www.dooccn.com/php7/#i...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28544.html

相關文章

  • 自如2018新年活動系統 — 搶紅包

    摘要:活動規模既然公司對自如客這么闊,那對我們員工也得夠意思,所以年底我們共準備了個活動。拆分后,紅包占有只需操作,響應性能已不是問題。 首發于 樊浩柏科學院 2017 年是自如快速增長的一年,自如客突破 100 萬,管理資產達到 50 萬間,在年底成功獲得了 40 億 A 輪融資,而這些都要感謝廣大的自如客,公司為了回饋自如客,在六周年活動時就發放了 6000 萬租住基金,當然年底散幣活...

    fanux 評論0 收藏0
  • 自如2018新年活動系統 — 搶紅包

    摘要:活動規模既然公司對自如客這么闊,那對我們員工也得夠意思,所以年底我們共準備了個活動。拆分后,紅包占有只需操作,響應性能已不是問題。 首發于 樊浩柏科學院 2017 年是自如快速增長的一年,自如客突破 100 萬,管理資產達到 50 萬間,在年底成功獲得了 40 億 A 輪融資,而這些都要感謝廣大的自如客,公司為了回饋自如客,在六周年活動時就發放了 6000 萬租住基金,當然年底散幣活...

    learning 評論0 收藏0
  • 如何做一個小程序口令紅包功能

    摘要:語音識別該功能的應用場景是用戶設置了一個中文的口令紅包,接收到該紅包的用戶需要用語音說出該口令,完全匹配的話則獲取該紅包的某個比例金額。表結構如下如此,便完成了語音識別功能。 在做小程序后端支持的過程中遇到不少有意思的功能,有些比較考你的思維散發及解決問題的實際能力,這里摘錄一下記錄下來,是為拋磚引玉、如能幫到別人,自然是最好不過了。 先放幾張設計圖看下大概功能: showImg(ht...

    zhiwei 評論0 收藏0
  • 淺析微信支付:商戶平臺開通現金紅包、指定用戶發放、紅包記錄查詢

    摘要:本文是淺析微信支付系列文章的第十三篇,主要講解在如何開通商戶平臺的紅包功能和為用戶發放紅包,以及查詢發送紅包記錄。操作路徑登錄微信支付商戶平臺產品中心現金紅包開通。 本文是【淺析微信支付】系列文章的第十三篇,主要講解在如何開通商戶平臺的紅包功能和為用戶發放紅包,以及查詢發送紅包記錄。 淺析微信支付系列已經更新十三篇了喲~,沒有看過的朋友們可以看一下哦。 淺析微信支付:(余額提現)企業...

    fizz 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<