>백엔드 개발 >PHP 튜토리얼 >PHP에 구현된 WeChat 빨간 봉투 알고리즘 분석(비공식)_php 기술

PHP에 구현된 WeChat 빨간 봉투 알고리즘 분석(비공식)_php 기술

WBOY
WBOY원래의
2016-05-16 20:07:321202검색

이 기사의 예에서는 PHP로 구현된 WeChat 빨간 봉투 알고리즘을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 내용은 다음과 같습니다.

최근 WeChat 그룹에서 빨간 봉투 기능을 경험했습니다. 빨간 봉투에는 두 가지 유형이 있습니다.

1. 평범한 빨간 봉투

2. 행운의 빨간 봉투를 받아가세요

일반적인 빨간 봉투를 분석할 필요가 없습니다. 같은 냄비에 쌀을 균등하게 나누는 것이 원칙입니다.

행운의 빨간 봉투는 행운(행운)을 의미합니다. 어떤 사람은 많이 잡을 수도 있고, 어떤 사람은 조금이라도 잡을 수도 있습니다. 물론 먼저 잡으면 더 많이 얻을 수 있다는 의미는 아닙니다. 최종 분석은 무작위입니다.

비슷한 기능을 구현할 수 있을지 고민해보고 직접 작성해봤습니다(감히 알고리즘이라고는 말할 수 없습니다).

// $bonus_total 红包总金额
// $bonus_count 红包个数
// $bonus_type 红包类型 1=拼手气红包 0=普通红包
function randBonus($bonus_total=0, $bonus_count=3, $bonus_type=1){
  $bonus_items  = array(); // 将要瓜分的结果
  $bonus_balance = $bonus_total; // 每次分完之后的余额
  $bonus_avg   = number_format($bonus_total/$bonus_count, 2); // 平均每个红包多少钱
  $i       = 0;
  while($i<$bonus_count){
    if($i<$bonus_count-1){
      $rand      = $bonus_type&#63;(rand(1, $bonus_balance*100-1)/100):$bonus_avg; // 根据红包类型计算当前红包的金额
      $bonus_items[] = $rand;
      $bonus_balance -= $rand;
    }else{
      $bonus_items[] = $bonus_balance; // 最后一个红包直接承包最后所有的金额,保证发出的总金额正确
    }
    $i++;
  }
  return $bonus_items;
}

자, 지금 경험해보자

// 发3个拼手气红包,总金额是100元
$bonus_items  = randBonus(100, 3, 1);
// 查看生成的红包
var_dump($bonus_items);
// 校验总金额是不是正确,看看微信有没有坑我们的钱
var_dump(array_sum($bonus_items));

배열을 사용하여 구현된 또 다른 버전은 원리가 비슷합니다.

function sendRandBonus($total=0, $count=3, $type=1){
  if($type==1){
    $input     = range(0.01, $total, 0.01);
    if($count>1){
      $rand_keys = (array) array_rand($input, $count-1);
      $last    = 0;
      foreach($rand_keys as $i=>$key){
        $current  = $input[$key]-$last;
        $items[]  = $current;
        $last    = $input[$key];
      }
    }
    $items[]    = $total-array_sum($items);
  }else{
    $avg      = number_format($total/$count, 2);
    $i       = 0;
    while($i<$count){
      $items[]  = $i<$count-1&#63;$avg:($total-array_sum($items));
      $i++;
    }
  }
  return $items;
}

이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.