ホームページ  >  記事  >  バックエンド開発  >  PHP に基づいて WeChat 赤い封筒を実装するためのアルゴリズム

PHP に基づいて WeChat 赤い封筒を実装するためのアルゴリズム

墨辰丷
墨辰丷オリジナル
2018-06-01 16:45:281895ブラウズ

誰もが WeChat を使用して赤い封筒を大量に送信したことがありますが、WeChat で赤い封筒を大量に送信するにはどうすればよいですか?この記事では、興味のある友達はそれを参照してください

私は突然、同窓会のWeChatグループに赤い封筒を送ることを思いつき、赤い封筒の合計を10元に設定し、28人がランダムに受け取れるようにサポートしました。 。
興味深い結果が現れました:
Aは0.26元を受け取りました
Bは0.29元を受け取りました
Cは0.02元を受け取りました
Dは0.56元を受け取りました
Eは0.64元を受け取りました
...
WeChatはどのようなアルゴリズムを使用していますか?する? Baidu で調べてみたところ、まだ公式の説明はありません。Zhihu にはここをクリックしてください。ただし、その議論は深すぎて罠のようです。
私は独自のロジックに従って試してみました。このアルゴリズムは次の要件を満たす必要があります:
1. 全員が赤い封筒を受け取ることができる必要があります。
2. 各人が受け取った赤い封筒の金額の合計。 ;
3. 赤い封筒を受け取ることができるかどうかは人によって異なりますが、その差があまりにも大きくてはなりません。そうしないと、アルゴリズムが単純でなければなりません。 Tencent の署名は失敗します。
正式なコーディングの前に、まず分析用のプログレッシブ モデルを構築します。 ルール
合計金額を 10 元に設定し、N 人がランダムに受け取ります:

N=1 その後、赤い封筒の金額 = X元;

N=2 2 番目の赤い封筒を正常に発行できるようにするため、最初の各赤い封筒の金額 = 0.01 ~ 9.99 の乱数 2 番目の赤い封筒 = 10 - 最初の赤い封筒の金額赤い封筒;

N=3 赤い封筒 1 = 0.01 から 0.98 までの乱数 赤い封筒 2=0.01 から (10-赤い封筒 1-0.01) までの乱数
赤い封筒 3=10-赤い封筒1-赤い封筒 2

...

この時点で模様が現れます!コーディングを始めましょう!
Phpコード

header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 
$total=10;//红包总额 
$num=8;// 分成8个红包,支持8人随机领取 
$min=0.01;//每个人最少能收到0.01元 
 
for ($i=1;$i<$num;$i++) 
{ 
 $safe_total=$total-($num-$i)*$min;//随机安全上限 
 $money=mt_rand($min*100,$safe_total*100)/100; 
 $total=$total-$money; 
 echo &#39;第&#39;.$i.&#39;个红包:&#39;.$money.&#39; 元,余额:&#39;.$total.&#39; 元 <br/>&#39;; 
} 
echo &#39;第&#39;.$num.&#39;个红包:&#39;.$total.&#39; 元,余额:0 元&#39;;

入力したら変動が大きすぎてデータが退屈すぎる!


1枚目の赤い封筒:7.48元、残高:2.52元2枚目の赤い封筒:1.9元、残高:0.62元
3枚目の赤い封筒:0.49元、残高:0.13元
4枚目の赤い封筒:0.04元、残高:0.09元
5枚目の赤い封筒:0.03元、残高:0.06元
6枚目の赤い封筒:0.03元、残高:0.03元
7枚目の赤い封筒:0.01元、残高:0.02元
8枚目の赤い封筒:0.02元、残高: 0 元

それを改善し、変動を制御するためのランダムな安全上限として平均値を使用します

Php コード

header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 
$total=10;//红包总额 
$num=8;// 分成8个红包,支持8人随机领取 
$min=0.01;//每个人最少能收到0.01元 
 
for ($i=1;$i<$num;$i++) 
{ 
 $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限 
 $money=mt_rand($min*100,$safe_total*100)/100; 
 $total=$total-$money; 
 echo &#39;第&#39;.$i.&#39;个红包:&#39;.$money.&#39; 元,余额:&#39;.$total.&#39; 元 <br/>&#39;; 
} 
echo &#39;第&#39;.$num.&#39;个红包:&#39;.$total.&#39; 元,余额:0 元&#39;;

出力結果は下の図に示されています


最初の赤い封筒: 0.06元、残高:9.94元 2枚目の赤い封筒:1.55元、残高:8.39元
3枚目の赤い封筒:0.25元、残高:8.14元
4枚目の赤い封筒:0.98元、残高:7.16元
5枚目の赤い封筒: 1.88元、残高: 5.28元
6枚目の赤い封筒: 1.92元、残高: 3.36元
7枚目の赤い封筒: 2.98元、残高: 0.38元
8枚目の赤い封筒: 0.38元、残高: 0元

要約: 以上 この記事の内容全体が、皆さんの学習に役立つことを願っています。

関連する推奨事項:

PHPはAlipayの即時支払い機能を実現します

PSRプログラミング標準に準拠したPHPの例

PHPはAlipayの即時支払い機能を実現します

以上がPHP に基づいて WeChat 赤い封筒を実装するためのアルゴリズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。