Maison >développement back-end >tutoriel php >Algorithme d'enveloppe rouge aléatoire implémenté en php

Algorithme d'enveloppe rouge aléatoire implémenté en php

*文
*文original
2017-12-27 14:45:563878parcourir

Cet article présente principalement l'algorithme d'enveloppe rouge WeChat implémenté en PHP et analyse les techniques d'algorithme aléatoire associées pour les enveloppes rouges chanceuses sous forme d'exemples. J'espère que cela aide tout le monde.

Les détails sont les suivants :

J'ai récemment expérimenté la fonction d'enveloppe rouge dans le groupe WeChat. Il existe deux types d'enveloppes rouges :

1. enveloppes

2. Enveloppes rouges porte-bonheur

Les enveloppes rouges ordinaires n'ont pas besoin d'être trop analysées, le principe est de les partager à parts égales.

L'enveloppe rouge porte-bonheur est une question de chance (chance). Certaines personnes peuvent en attraper beaucoup, et certaines personnes peuvent en attraper quelques pitoyables. Bien sûr, cela ne signifie pas que vous en obtiendrez plus si vous l'attrapez. d’abord. En dernière analyse, c’est aléatoire.

J'y ai réfléchi et je l'ai écrit moi-même pour voir si je pouvais réaliser des fonctions similaires (je n'ose pas dire que c'est un algorithme).


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


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

Recommandations associées :

Compréhension approfondie des nombres aléatoires basés sur PHP

PHP implémente l'échange de clés Diffie-Hellman (Diffie-Hellman) algorithme

Explication détaillée de la génération de labyrinthe PHP et de l'algorithme de recherche automatique de chemin

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