私が近年プレイした最もクレイジーなことは、特に旧正月の間に赤い封筒を送ることです。赤い封筒のランダムアルゴリズムを以下に書きました。実際には非常に簡単です。それは考え方を提供するだけです。私はそれがあなたにインスピレーションを与えることができることを願っています。
パブリッククラスwxalgorithm { / *** @param moneysum合計量を入力* @param rednum red packetsの数を入力* / private static void wxalgorithm(double moneysum、int rednum){//最小金額を設定します。 RANDOM RANDOM = new Random(); //正確な小数点2桁numberformat formatt = new decimalformat( "#。##"); for(int i = 1; i <rednum; i ++){//乱数、値の範囲は最小値とバランス文字列money = formatter.format(random.nextdouble() *(moneysum -moneymin)+moneymin); //数値変換moneysum = double.valueof(formatter.format(moneysum -double.valueof(money))); System.out.println( "th" + i + "red envelope:" + money + "yuan、balance:" + moneysum); } system.out.println( "last red envelope:" + moneysum + "yuan、balance:" +(moneysum -moneysum)); } public static void main(string [] args){wxalgorithm(10.26、9); }}その後、いくつかのWeChatランダムな赤いエンベロープアルゴリズムがオンラインで収集され、参考になりました。
public static double [] getMoney(double money、int num){random r = new Random(); decimalformat format = new decimalformat( "。##"); double middle = double.parsedouble(format.format(money/num)); double [] dou = new double [num]; double redmoney = 0; double nextmoney = money;二重和= 0; int index = 0; for(int i = num; i> 0; i-){if(i == 1){dou [index] = nextmoney; } else {while(true){string str = format.format(r.nextdouble()*nextmoney); redmoney = double.parsedouble(str); if(redmoney> 0 && redmoney <middle){break; }} nextmoney = double.parsedouble(format.format(nextmoney -redmoney)); sum = sum + redmoney; dou [index] = redmoney;中間= double.ParseDouble(format.format(nextmoney/(i-1)));インデックス++; }} return dou; }基本的なアイデアは次のとおりです。最初に赤い封筒の平均値を計算し、次にこの平均値よりも小さい乱数の赤い封筒で赤い封筒を渡します。赤い封筒が送られた後、それに応じて赤い封筒の合計量を減らす必要があります。同時に、平均を再計算します:新しい総量%(元の総赤エンベロープ番号-1)は、最後の赤い封筒まで、残りのすべての量を入れます。
また、多くのエキサイティングなソースコード共有があります。Javaのシンプルなランダムレッドエンベロープ割り当てアルゴリズムを実装して、ソースコードを実装します。
パッケージcom.sunron.test; import java.math.bigdecimal; import org.junit.test; public class hongbao {@test public void testhonbao(){hb(100、9、0.01); } void hb(double total、int num、double min){for(int i = 1; i <num; i ++){double safe_total =(total-(num-i)*min)/(num-i); double money = math.random()*(safe_total-min)+min; bigdecimal money_bd = new bigdecimal(money); money = money_bd.setscale(2、bigdecimal.round_half_up).doublevalue(); Total = Total-Money; BigDecimal Total_bd = new BigDecimal(Total); total = total_bd.setscale(2、bigdecimal.round_half_up).doublevalue(); System.out.println( "th"+i+"赤いエンベロープ:"+Money+"、Balance is:"+Total+"Yuan"); } system.out.println( "th"+num+"red envelope:"+total+"、balance is:0 yuan"); } void zb(){for(int a = 0; a <= 10000; a ++){if(a%1000 == 0)system.out.println(a); }}}他の人が赤い封筒をつかんでいるときは、ランダムな赤い封筒のアルゴリズムを研究します。
public static void main(string [] args){//赤い封筒の数int = 10; //赤い封筒の合計量フロート合計= 100;フロートマネー; //最小レッドエンベロープダブルミニ= 1;ダブルマックス; int i = 1;リストmath = new ArrayList(); DecimalFormat df = new DecimalFormat( "##。##"); (i <number){//赤いエンベロープが最大であっても、各赤い封筒は残りの赤い封筒の最小値を下回らないことを確認してください。 int k =(int)(number -i) / 2; //最後の2人が受け取った赤い封筒が、残りの赤い封筒を超えないことを確認してください(番号-I <= 2){k = number -i; } //最大赤いエンベロープの平均制限はmax = max /kです。 //各赤い封筒が最小値より大きく、最大値よりも大きくないことを確認してください=(int)(min * 100 + math.random() *(max * 100 -min * 100 + 1)); Money =(Float)Money / 100; // 2つの小数の場所を保持しますmoney = float.parsefloat(df.format(money)); Total =(int)(total*100 -Money*100);合計=合計/100; Math.Add(Money); System.out.println( "thread" + i + "個人get" + money + "left" +合計); i ++; //最後の人は残りの赤い封筒を取り除きますif(i == number){math.add(合計); system.out.println( "thread" + i + "個人get" +合計 + "残り0"); }} //配列System.out.println( "このラウンドの赤い封筒のスレッド" +(math.indexof(collections.max) + 1) + "The Best Personal Luck"); }よりエキサイティングなコンテンツについては、「Android Wechat Development Tutorial Summary」と「Java Wechat Developmentチュートリアルの概要」をクリックしてください。
上記は、さまざまなアイデアを提供するさまざまなWeChatランダムレッドエンベロープアルゴリズムです。誰もがWeChat Random Red Envelope Algorithmを使用することを学ぶことが役立つことを願っています。また、wulin.comからよりエキサイティングなコンテンツに注意を払い続けることを願っています。