Home  >  Article  >  Backend Development  >  Random red envelope algorithm implemented in php

Random red envelope algorithm implemented in php

*文
*文Original
2017-12-27 14:45:563810browse

This article mainly introduces the WeChat red envelope algorithm implemented in PHP, and analyzes the related random algorithm techniques for lucky red envelopes in the form of examples. I hope to be helpful.

The details are as follows:

I have been experiencing the red envelope function in the WeChat group recently. There are two types of red envelopes:

1. Ordinary red envelopes

2. Lucky Red Envelope

No need to analyze the ordinary red envelope. The principle of rice in the same pot is to divide it equally.

The Lucky Red Packet is about luck (luck). Some people can grab a lot, and some people can grab a pitiful few. Of course, it doesn't mean that the first one will get more. In the final analysis, it is random.

#Thinked about it and wrote it myself to see if it can achieve similar functions (I dare not say it is an algorithm).


// $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?(rand(1, $bonus_balance*100-1)/100):$bonus_avg; // 根据红包类型计算当前红包的金额
      $bonus_items[] = $rand;
      $bonus_balance -= $rand;
    }else{
      $bonus_items[] = $bonus_balance; // 最后一个红包直接承包最后所有的金额,保证发出的总金额正确
    }
    $i++;
  }
  return $bonus_items;
}


Okay, let’s experience it now


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


Another version implemented using arrays, the principle is similar:


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?$avg:($total-array_sum($items));
      $i++;
    }
  }
  return $items;
}

Related recommendations:

In-depth understanding of random numbers based on PHP

PHP implements the Diffie–Hellman key exchange algorithm

Detailed explanation of PHP generated maze and automatic path finding algorithm

The above is the detailed content of Random red envelope algorithm implemented in php. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn