php 随机钱数,PHP 仿微信红包金额随机
博主寒冰最近閑來無事。就想研究一下微信紅包的金額隨機算法。早在微信紅包剛出來的時候就研究過。始終不得要領。后來,通過查閱諸多資料。聽說要實現“正態分布”。這個理論的東西不想深挖。恰好在網上一篇博客找到一個相對完整的算法。我經過試用確實不錯。經過我的一些優化達到了可用級別。
PHP 源碼如下:
class RandMoney
{
/**
* 紅包金額(元)
*
* -- 最小值:0.01。
*
* @var float
*/
private $rewardMoney;
/**
* 紅包數量
*
* @var int
*/
private $rewardNum;
/**
* 分散度值
*
* -- 1 ~ 10000
* --- 最佳值 100
*
* @var int
*/
private $scatter;
/**
* 執行紅包生成算法
*
* @param float $rewardMoney 隨機總金額。
* @param int $rewardNum 拆分數量。
* @param int $scatter 分散度值。
* @return void
*/
public function splitReward($rewardMoney, $rewardNum, $scatter = 100)
{
// 傳入紅包金額和數量。
$this->rewardMoney = $rewardMoney;
$this->rewardNum = $rewardNum;
$this->scatter = $scatter;
$this->realscatter = $this->scatter / 100;
$avgRand = round(1 / $this->rewardNum, 4);
$randArr = [];
while (count($randArr) < $rewardNum) {
$t = round(sqrt(mt_rand(1, 10000) / $this->realscatter));
$randArr[] = $t;
}
$randAll = round(array_sum($randArr) / count($randArr), 4);
$mixrand = round($randAll / $avgRand, 4);
$rewardArr = [];
foreach ($randArr as $key => $randVal) {
$randVal = round($randVal / $mixrand, 4);
$rewardArr[] = round($this->rewardMoney * $randVal, 2);
}
sort($rewardArr);
$rewardAll = array_sum($rewardArr);
$rewardArr[$this->rewardNum - 1] = round($this->rewardMoney - ($rewardAll - $rewardArr[$this->rewardNum - 1]), 2);
rsort($rewardArr);
return $rewardArr;
}
}
調用:
$money = 100; // 總額。
$people = 200; // 紅包個數。
$scatter = 100; // 分散度。就是拆成的金額分頁更大。
$reward = new RandMoney();
$rewardArr = $reward->splitReward($money, $people, $scatter);
print_r($rewardArr);
大家可以執行一下試試。
總結
以上是生活随笔為你收集整理的php 随机钱数,PHP 仿微信红包金额随机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nomad 为 Apple Watch
- 下一篇: 5 在java等于多少,java基础面试