PHP隨機紅包演算法詳解

墨辰丷
發布: 2023-03-26 16:42:02
原創
1698 人瀏覽過

這篇文章主要介紹了PHP實現的隨機紅包演算法,結合實例形式分析了php隨機紅包演算法的原理、實現方法與相關注意事項,需要的朋友可以參考下

#具體如下:

一、整體設計

演算法有很多種, 可以自行選擇, 主要的"架構" 是這樣的, 用redis decr( )指令去限流, 用mysql去記錄各種需要的資料

二、紅包演算法

簡單起見, 紅包金額用整數表示, 假設每個紅包裡邊有x個糖豆, 每個人最少一個豆

第一種: 每個紅包的最大金額是: (剩餘金額/剩餘紅包數) *2, 需要開始的時候預先分配給每個人一個豆


function randBean($total_bean, $total_packet)
{
  $min_bean = 1;
  $max_bean = 5000;
  $range = 2;
  $total_bean = $total_bean - $total_packet * $min_bean; //每个人预留一个最小值
  $list = [];
  $min = 1;
  while(count($list) < $total_packet){
    $max = floor($total_bean / $total_packet) * $range;
    $bean = rand($min, $max);
    if ($bean <= $max_bean - 1) {
      $list[] = $bean;
      $total_bean -= $bean;
    }
  }
  $list[] = $total_bean;//剩余的金豆作为最后一个红包
  //合并
  foreach ($list as $k => $v) {
    $list[$k] += $min_bean;
  }
  return $list;
}
登入後複製


多次統計

##第二種

, 對其簡單擴展一下, 每個紅包的最大金額是: (剩餘金額/剩餘紅包數)*3; 但是要求每次最少發2個紅包

第三種

, 線段法, 隨機產生幾個數字, 將一個直線分成幾段, 每段的長度(這個波動比較大, 不是很平均, 如果限制了每個紅包的大小, 會比較麻煩)


function abc ($total_bean, $total_packet)
{
  $min = 1;
  $max = $total_bean -1;
  $list = [];
  $maxLength = $total_packet - 1;
  while(count($list) < $maxLength) {
    $rand = mt_rand($min, $max);
    empty($list[$rand]) && ($list[$rand] = $rand);
  }
  $list[0] = 0; //第一个
  $list[$total_bean] = $total_bean; //最后一个
  sort($list); //不再保留索引
  $beans = [];
  for ($j=1; $j<=$total_packet; $j++) {
    $beans[] = $list[$j] - $list[$j-1];
  }
  // return $beans;
  echo &#39;<pre class="brush:php;toolbar:false">&#39;; print_r($beans); echo array_sum($beans);
}
abc(100000, 3);
登入後複製

第四種

:

因為每人最少1個豆, 那麼每次隨機生成豆數的時候要預留剩餘人數*1個豆;

#去掉這些必須剩餘的豆數後, 以剩下的豆數的平均值為最大值進行隨機生成本次豆數

相關建議:php實現的隨機紅包
演算法

php如何實作固定紅包以及隨機紅包
演算法詳解(圖)

php產生隨機紅包
演算法

#######

以上是PHP隨機紅包演算法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!