ホームページ  >  記事  >  バックエンド開発  >  WeChat は赤い封筒金額アルゴリズムをランダムに生成します php version_php の例

WeChat は赤い封筒金額アルゴリズムをランダムに生成します php version_php の例

WBOY
WBOYオリジナル
2016-08-04 08:56:47961ブラウズ

最近、赤い封筒を送る機能を勉強していたので、赤い封筒の生成アルゴリズムを書きました。

赤いエンベロープ生成アルゴリズムの要件
事前にすべての赤い封筒を生成するか、リクエストに応じて赤い封筒をランダムに生成します
簡単に言うと、大きな整数m(1元や100などの単位に直接分割)をn個の小さな整数に分解する処理です。小さな整数の範囲は[最小、最大]です
。 最も単純なアイデアは、最初に最小値を保証することです。各小さな赤いエンベロープには min が含まれることが保証され、その後、各リクエストで 0 から (max-min) までの範囲の整数が赤いエンベロープの量に加算されます。
このアルゴリズムは単純ですが、欠点があります。生成される最終的な赤い封筒は最低金額になる可能性があります。つまり、最終的な紅包は0.01元になる可能性がある。
もう 1 つの方法は、すべての赤いエンベロープを事前に生成することです。これにより、制御が容易になります。私が選択したのは、すべての赤いエンベロープを事前に生成することです。

理想的な赤い封筒生成アルゴリズム
理想的な赤いエンベロープの生成結果は、平均値に近い赤いエンベロープが多く、大きな赤いエンベロープと小さな赤いエンベロープの数が比較的少ないことです。
ご想像のとおり、生成された赤い封筒の数の分布は正規分布に似ています。

それでは、平均線に近い値をより多く持つというこの要件を達成するにはどうすればよいでしょうか?
目標は、平均に近い確率を高めることができるアルゴリズムを見つけることです。次に、この効果を達成するために、「拡張」、次に「収縮」の方法を使用します。
まず二乗し、次に二乗の範囲内で乱数を生成し、平方根を求めると、確率は平均ではなくなります。
具体的なアルゴリズム:(合計金額、合計人数、設定された最大値と最小値は合理的である必要があります)
PHPコード

リーリー

以上がこの記事の全内容です。皆様の学習に役立つことを願っております。また、皆様も Script Home をサポートしていただければ幸いです。

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