离散数学模拟微信红包算法升级版
生活随笔
收集整理的這篇文章主要介紹了
离散数学模拟微信红包算法升级版
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
可以自定義紅包總金額,總包數,每包最小金額
<?php/*** 紅包類*/class RedPacket{// 要發的紅包總金額private $total = 0.01;// 總共要發紅包總包數private $bags = 1;// 每包最小紅包金額數private $min = 0.01;function __construct($total, $bags, $min){$this->total = $total;$this->bags = $bags;$this->min = $min;}/*** [發紅包]* @return [array] [紅包的每包金額數組]*/public function give_red_packets(){$redpacket_arr = [];//根據最小值不一樣,需要轉化switch (true) {case $this->min >= 1:$right_value = 1;break;case $this->min >= 0.1:$right_value = 10;break;case $this->min >= 0.01:$right_value = 100;break;}for($i = 1;$i < $this->bags;$i++){//設置循環,邊界值是紅包數-1//保證后面至少有($bags - $i)個最小金額可以發,通過公式模擬數學中的離散模型$safe = bcdiv(($this->total - ($this->bags - $i) * $this->min), ($this->bags - $i), 2);//根據離散數學模型得到每個紅包的金額$rand = rand(0, bcmul($safe - $this->min, $right_value, 2)) + $this->min;//如果大于倍值,需要轉化,反之,不需要。為了防止有的紅包金額小于設定的最小金額if ($rand >= ($this->min * $right_value)) {$money = bcdiv($rand, $right_value, 2);} else {$money = strval($rand);}$this->total -= $money; //替換$total的值$redpacket_arr[] = number_format($money, 2);//把每個紅包金額數格式化,存起來}$left = number_format($this->total, 2);//調用number_format()方法,對數字$total格式化$redpacket_arr[] = $left;//輸出最后一個紅包return $redpacket_arr;}}//發紅包$redpacket = new RedPacket(881.88, 20, 1.5);$redpacket_arr = $redpacket->give_red_packets();echo '<pre>';print_r($redpacket_arr);print_r('紅包總金額:' . array_sum($redpacket_arr));echo '</pre>';881.88元,20包,每包至少1.5元
效果截圖:
100元,33包,每包至少0.01元
總結
以上是生活随笔為你收集整理的离散数学模拟微信红包算法升级版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四叠半神话大系(bfs序+st+在线倍增
- 下一篇: 空气净化器只是心理作用???