Maison  >  Article  >  développement back-end  >  Explication détaillée de l'algorithme de génération aléatoire de l'enveloppe rouge php WeChat

Explication détaillée de l'algorithme de génération aléatoire de l'enveloppe rouge php WeChat

墨辰丷
墨辰丷original
2018-06-01 16:39:471750parcourir

Cet article présente principalement en détail la version PHP de l'algorithme de génération aléatoire de l'enveloppe rouge WeChat, qui a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Pensez-y et écrivez-le vous-même en PHP. L'algorithme de génération aléatoire d'enveloppe rouge de WeChat réalise des fonctions similaires (en fait, je n'ose pas dire que c'est un algorithme).
// $bonus_total Montant total de l'enveloppe rouge
// $bonus_count Nombre d'enveloppes rouges
// $bonus_type Type d'enveloppe rouge 1 = combattre l'enveloppe rouge chanceuse 0 = enveloppe rouge ordinaire

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;
}

D'accord, faisons-en l'expérience maintenant

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

Autre version implémentée à l'aide de tableaux, le principe est similaire :

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;
}

Résumé : Ce qui précède C'est tout le contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.

Recommandations associées :

phpMéthodes de combinaison de Redis pour obtenir une simultanéité élevée dans la publication et Weibo

Explication détaillée du cas de PHP+Ajax détectant si le réseau est normal

Explication détaillée de l'algorithme SnowFlake pour PHP pour générer des identifiants uniques

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn