この記事では、主にPHPで実装されたランダムな赤いエンベロープアルゴリズムを紹介し、PHPのランダムな赤いエンベロープアルゴリズムの原理、実装方法、および関連する注意事項をサンプルの形で分析します。必要な友人はそれを参照できます
詳細は次のとおりです。
1. 全体的なデザイン
多くのアルゴリズムがあり、自分で選択できます。主な「アーキテクチャ」は次のようなもので、redis decr() コマンドを使用してフローを制限し、mysql を使用します。さまざまな必要なデータを記録します
2. 赤い封筒のアルゴリズム
簡単のため、赤い封筒の量は整数で表されます。各赤い封筒には残りの赤い封筒の数が含まれていると仮定します)*。 2、最初に各人に1つのBeanを事前に割り当てる必要があります
function randBean($total_bean, $total_packet) { $min_bean = 1; $max_bean = 5000; $range = 2; $total_bean = $total_bean - $total_packet * $min_bean; //每个人预留一个最小值 $list = []; $min = 1; while(count($list) < $total_packet){ $max = floor($total_bean / $total_packet) * $range; $bean = rand($min, $max); if ($bean <= $max_bean - 1) { $list[] = $bean; $total_bean -= $bean; } } $list[] = $total_bean;//剩余的金豆作为最后一个红包 //合并 foreach ($list as $k => $v) { $list[$k] += $min_bean; } return $list; }
2番目の種類は、単純に展開し、それぞれの赤い封筒の最大量は: (残量/残りの赤い封筒の数)*3; ただし、毎回少なくとも 2 つの赤い封筒を送る必要があります
3 番目の方法 は、ランダムにいくつかの数値を生成し、直線をいくつかに分割しますセグメント、それぞれ セグメントの長さ (これは大きく変動し、あまり平均的ではありません。各赤い封筒のサイズが制限されている場合、さらに面倒になります)
function abc ($total_bean, $total_packet) { $min = 1; $max = $total_bean -1; $list = []; $maxLength = $total_packet - 1; while(count($list) < $maxLength) { $rand = mt_rand($min, $max); empty($list[$rand]) && ($list[$rand] = $rand); } $list[0] = 0; //第一个 $list[$total_bean] = $total_bean; //最后一个 sort($list); //不再保留索引 $beans = []; for ($j=1; $j<=$total_packet; $j++) { $beans[] = $list[$j] - $list[$j-1]; } // return $beans; echo '<pre class="brush:php;toolbar:false">'; print_r($beans); echo array_sum($beans); } abc(100000, 3);
4番目の
:
各人は少なくとも 1 つの Bean を持っているため、Bean の数がランダムに生成されるたびに、残りの Bean 数 * 1 Bean を予約する必要があります。これらの必要な残りの Bean 数を削除した後、残りの数の平均を使用します。今回は Bean の数をランダムに生成するための最大値として Bean を使用します
関連する推奨事項:
php で実装されたランダムな赤い封筒
アルゴリズムアルゴリズムの詳細説明(画像) アルゴリズム以上がPHPランダムレッドエンベロープアルゴリズムの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。