最近、中国の旧正月に赤い封筒と挨拶を送ることが新しい傾向になりました。プログラマーとして、彼は赤い封筒についてよりもアルゴリズムにはるかに興味があります。ここでは、彼が考えたランダムな赤い封筒割り当て戦略を紹介します。アドバイスをください。
アルゴリズムの紹介
1。赤いエンベロープの量制限
WeChat Red Envelopesの場合、ランダムな最小レッドエンベロープは1ポイントで、最大量は200元であることがわかっています。ここでは、赤い封筒の範囲も設定します。次のコードはお金の単位です。
//最小レッドエンベロープクォータプライベート静的最終int minmoney = 1; //最大赤エンベロープクォータプライベート静的最終int maxmoney = 200 * 100;
2。赤い封筒の量が合法かどうかを判断します
このステップにはアルゴリズム全体が伴うことに注意してください。赤い封筒を割り当てる前に金額が合法かどうかを判断する必要があるだけでなく、各人が暫定的にランダムな金額を設定した後、残りの金額が合法かどうかを判断する必要もあります。
Private Boolean iSright(int money、int count){double avg = money / count; if(avg <minmoney){return false; } if(avg> maxmoney){return false; } trueを返します。 } 3.赤い封筒をランダムに生成します
ここでは、ランダムな方法を使用して、MinmoneyとMaxmoneyの間に赤い封筒を生成します。赤い封筒を生成した後、残りのお金が合法的な赤い封筒であるかどうかを判断する必要があります。それが合法的な赤い封筒でない場合は、流通計画を再生します。流通計画を再生するとき、生成された赤いエンベロープが大きすぎるか小さすぎるかを判断する必要があります。赤い封筒が大きすぎる場合、次回はこの赤い封筒の量の赤い封筒にわずかな値にランダムに達します。赤い封筒の量が小さすぎる場合、赤い封筒の量を含む赤い封筒を生成して大きな値になります。
private int random(int money、int mins、int maxs、int count){//赤い封筒の数は1で、金額は(count == 1){return money; } //最大量と最小量が等しい場合、(mins == maxs){return mins; } int max = maxs> money?お金:マックス; //ランダムレッドエンベロープを生成int one =((int)math.rint(math.random() *(max -mins) + mins)%max + 1; int money1 = money -one; //この割り当て計画が正しいかどうかを判断します(isright(money1、count -1)){return one; } else {double avg = money1 /(count -1); if(avg <minmoney){//再帰的に呼び出し、赤いエンベロープリターンランダムの最大量(お金、mins、1、count)を変更します。 } else if(avg> maxmoney){//再帰的に呼び出し、最小限の赤いエンベロープリターンランダム(お金、1、最大、count)を変更します。 }} return one; } 4.赤い封筒の割り当てを実現します
ここでは、大量の資金を占有する特定の赤い封筒を避けるために、非最後の赤いエンベロープの最大量を設定する必要があり、平均赤い封筒量をn倍に設定します。 1、2、3の方法では、赤い封筒の割り当てを実現できます。
//各赤い封筒の最大量は、平均的なプライベート静的ファイナルダブルタイムの倍数= 2.1です。 public list <integer> splitedPackets(int money、int count){if(!isright(money、count)){return null; } list <integer> list = new ArrayList <Integer>(); //赤いエンベロープの最大量は、平均量int max =(int)(money * times /count)です。 max = max> maxmoney? Maxmoney:Max; for(int i = 0; i <count; i ++){int one = random(money、minmoney、max、count -i); list.add(1);お金 - = 1; }返品リスト。 }赤い封筒割り当て計画の評価
上記は、赤い封筒の基本アルゴリズムを紹介します。一度にアルゴリズムを確認しましょう。 200元の赤い封筒と100コピーがあるとします。最終的な割り当て計画を見てみましょう。
完全なコード
/ ** *@説明: */パッケージcom.lulei.weixin.util; java.util.arraylistをインポートします。 java.util.listをインポートします。 com.lulei.util.jsonutilをインポートします。 Public Class Redpacketutil {//最小レッドエンベロープクォータプライベート静的最終int minmone = 1; //最大赤エンベロープクォータプライベート静的最終int maxmoney = 200 * 100; //各赤いエンベロープの最大数は、平均プライベート静的ファイナルダブルタイムの倍数= 2.1です。 / ** * @param Money * @param count * @return * @author:lulei * @description:split Red Envelope */ public List <integer> splitedPackets(int money、int count){if(!isright(money、count)){return null; } list <integer> list = new ArrayList <Integer>(); //赤いエンベロープの最大量は、平均量int max =(int)(money * times /count)です。 max = max> maxmoney? Maxmoney:Max; for(int i = 0; i <count; i ++){int one = random(money、minmoney、max、count -i); list.add(1);お金 - = 1; }返品リスト。 } /** * @param Money * @param mins * @param maxs * @param count * @return * @author:lulei * @description:ランダムレッドエンベロープリミット * /プライベートランダム * /private intランダム(int mones、int mins、int count){//赤いエンベロープの数は1、returniveの数は1つです。 } //最大量と最小量が等しい場合、(mins == maxs){return mins; } int max = maxs> money?お金:マックス; //ランダムレッドエンベロープを生成int one =((int)math.rint(math.random() *(max -mins) + mins)%max + 1; int money1 = money -one; //この割り当て計画が正しいかどうかを判断します(isright(money1、count -1)){return one; } else {double avg = money1 /(count -1); if(avg <minmoney){//再帰的に呼び出し、赤いエンベロープリターンランダムの最大量(お金、mins、1、count)を変更します。 } else if(avg> maxmoney){//再帰呼び出し、最小限の赤いエンベロープリターンランダム(お金、1、最大、count)を変更します。 }} return one; } / ** * @param Money * @param count * @return * @author:lulei * @description:この種の赤い封筒は合法ですか? if(avg <minmoney){return false; } if(avg> maxmoney){return false; } trueを返します。 } public static void main(string [] args){// dodo auto-enerated method stub redpacketutil util = new Redpacketutil(); System.out.println(jsonutil.parsejson(util.splitredpackets(20000、100))); }}よりエキサイティングなコンテンツについては、「Android Wechat Development Tutorial Summary」と「Java Wechat Developmentチュートリアルの概要」をクリックしてください。
上記はこの記事に関するものです。誰もがJavaプログラミングを学ぶことが役立つことを願っています。