Heim  >  Artikel  >  Backend-Entwicklung  >  Zufälliger Red-Envelope-Algorithmus in PHP implementiert

Zufälliger Red-Envelope-Algorithmus in PHP implementiert

*文
*文Original
2017-12-27 14:45:563827Durchsuche

In diesem Artikel wird hauptsächlich der in PHP implementierte WeChat-Algorithmus für rote Umschläge vorgestellt und die zugehörigen Zufallsalgorithmustechniken für glückliche rote Umschläge anhand von Beispielen analysiert. Ich hoffe, es hilft allen.

Die Details sind wie folgt:

Ich habe kürzlich die Funktion für rote Umschläge in der WeChat-Gruppe erlebt. Es gibt zwei Arten von roten Umschlägen:

1 Umschläge

2. Glückliche rote Umschläge

Gewöhnliche rote Umschläge müssen nicht allzu sehr analysiert werden, das Prinzip besteht darin, sie gleichmäßig zu teilen.

Bei dem glücklichen roten Umschlag geht es um Glück (Glück), und manche können sich nur wenige ergattern. Natürlich bedeutet das nicht, dass der Erste am meisten bekommt Letztlich ist es Zufall.

Ich habe darüber nachgedacht und es selbst geschrieben, um zu sehen, ob ich ähnliche Funktionen erreichen kann (ich wage nicht zu sagen, dass es ein Algorithmus ist).


// $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, lass es uns jetzt erleben


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


Eine weitere Version, die mithilfe von Arrays implementiert ist. Das Prinzip ist ähnlich:


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

Verwandte Empfehlungen:

Umfassendes Verständnis von Zufallszahlen basierend auf PHP

PHP implementiert Diffie-Hellman-Schlüsselaustausch (Diffie–Hellman) Algorithmus

Detaillierte Erläuterung der PHP-Labyrinth-Generierung und des automatischen Pfadfindungsalgorithmus

Das obige ist der detaillierte Inhalt vonZufälliger Red-Envelope-Algorithmus in PHP implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn