この記事の例では、参照のためにJava宝くじアルゴリズムを共有しています。特定のコンテンツは次のとおりです
1。アルゴリズム分析
賞品は、確率に応じて間隔に分割されます。各間隔は賞品を表し、その後、乱数が描画され、間隔が逆チェックされます。
2。コード
コアアルゴリズム
public class arithmetic {//拡大private private static final int mulriple = 1000000; public int pay(list <price> pricings){int lastScope = 0; //シャッフル、賞の注文コレクションを破壊します。シャッフル(賞); map <integer、int [] >> pricecopes = new hashmap <integer、int []>(); map <integer、integer> pricingquantity = new hashmap <integer、integer>(); for(賞金:賞品){int prish = price.getPrizeId(); //パーティションインターバルint currentscope = lastScope + price.getProbability()。倍数(new bigdecimal(mulriple))。intvalue(); PriceCopes.put(aditid、new int [] {lastScope + 1、currentscope}); PriceQuantity.put(adivid、price.getQuantity()); lastScope = currentscope; } // 1-1000000の間の乱数を取得しますint luckynumber = new Random()。nextint(mulriple); int lucyprizeid = 0; //乱数が配置されている間隔を見つけます((null!= pricecopes)&&!prizescopes.isempty()){set <entry <integer、int [] >> entrycopes.entryset(); for(map.entry <integer、int []> m:entersets){int key = m.getkey(); if(luckynumber> = m.getValue()[0] && luckynumber <= m.getValue()[1] && pricequantity.get(key)> 0){luckyprizeid = key;壊す; }}} if(LuckyPrizeId> 0){//賞品在庫を1つだけ削減} return luckyprizeid; }}賞金
パブリッククラス賞{ / ***賞のユニークなラベル* /プライベート整数賞。 / ***勝つ確率*/プライベートビッグデキマル確率。 / ***賞品の数*/民間整数数。 public Integer getPrizeId(){return aditid; } public void setPrizeId(integer adividid){this.prizeid = ridivid; } public bigdecimal getProbability(){return確率; } public void setProbability(bigdecimal確率){this.probability =確率; } public Integer getQuantity(){return Quantion; } public void setquantity(整数数){this.quantity = Quanty; }} 3。テスト
賞品1確率:5%
賞品2確率:10%
賞品3確率:15%
賞品4確率:20%
賞品5確率:50%
public class test {public static void main(string [] args){list <prite> pricings = new arraylist <abition>();賞品ride1 = new Prize(); Price1.SetPrizeID(1); Price1.SetProbability(新しいBigDecimal(0.05)); Price1.setquantity(1); Price.Add(Prize1);賞品ride2 = new Prize(); Price2.setPrizeID(2); Price2.SetProbability(新しいBigDecimal(0.10)); Price2.setquantity(10); Price.Add(Prize2);賞品ride3 = new Prize(); Price3.SetPrizeID(3); Price3.SetProbability(新しいBigDecimal(0.15)); Price3.setquantity(20); Price.Add(賞);賞品価格4 =新しい賞(); Price4.setPrizeID(4); Price4.SetProbability(新しいBigDecimal(0.20));価格4.setquantity(50); Price.Add(Prize4);賞品rist5 = new Prize(); Price5.setPrizeID(5); Price5.SetProbability(新しいBigDecimal(0.50)); Price5.setquantity(200); Price.Add(賞5); int price1gettimes = 0; int price2gettimes = 0; int price3gettimes = 0; int price4getTimes = 0; int price5gettimes = 0; int price5gettimes = 0;算術算術= new arithmetic(); int times = 1000; for(int i = 0; i <times; i ++){int fideid = arithmetic.pay(prizes); switch(adividid){case 1:price1gettimes ++;壊す;ケース2:Price2GetTimes ++;壊す;ケース3:Price3GetTimes ++;壊す;ケース4:Price4GetTimes ++;壊す;ケース5:Price5GetTimes ++;壊す; }} system.out.println( "宝くじ数" + times); System.out.println( "aftion1 wins" + aprive1gettimes); System.out.println( "aprid2 wins" + aprive2gettimes); System.out.println( "aftion3 wins" + ride3gettimes); System.out.println( "aftion4 wins" + aprive4gettimes); System.out.println( "aftion5 wins" + aprive5gettimes); }}結果:
1000個の抽出により、アルゴリズムの精度がまだ非常に高いことがわかります。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。