Maison > développement back-end > tutoriel php > 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

墨辰丷
Libérer: 2023-03-29 09:44:01
original
1794 Les gens l'ont consulté

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;
}
Copier après la connexion

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));
Copier après la connexion

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;
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal