本文實例為大家分享了java抽獎算法,供大家參考,具體內(nèi)容如下
1. 算法分析
根據(jù)概率將獎品劃分區(qū)間,每個區(qū)間代表一個獎品,然后抽取隨機數(shù),反查落在那個區(qū)間上,即為所抽取的獎品。
2. 代碼
核心算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
public class Arithmetic { // 放大倍數(shù) private static final int mulriple = 1000000 ; public int pay(List<Prize> prizes) { int lastScope = 0 ; // 洗牌,打亂獎品次序 Collections.shuffle(prizes); Map<Integer, int []> prizeScopes = new HashMap<Integer, int []>(); Map<Integer, Integer> prizeQuantity = new HashMap<Integer, Integer>(); for (Prize prize : prizes) { int prizeId = prize.getPrizeId(); // 劃分區(qū)間 int currentScope = lastScope + prize.getProbability().multiply( new BigDecimal(mulriple)).intValue(); prizeScopes.put(prizeId, new int [] { lastScope + 1 , currentScope }); prizeQuantity.put(prizeId, prize.getQuantity()); lastScope = currentScope; } // 獲取1-1000000之間的一個隨機數(shù) int luckyNumber = new Random().nextInt(mulriple); int luckyPrizeId = 0 ; // 查找隨機數(shù)所在的區(qū)間 if (( null != prizeScopes) && !prizeScopes.isEmpty()) { Set<Entry<Integer, int []>> entrySets = prizeScopes.entrySet(); for (Map.Entry<Integer, int []> m : entrySets) { int key = m.getKey(); if (luckyNumber >= m.getValue()[ 0 ] && luckyNumber <= m.getValue()[ 1 ] && prizeQuantity.get(key) > 0 ) { luckyPrizeId = key; break ; } } } if (luckyPrizeId > 0 ) { // 獎品庫存減一 } return luckyPrizeId; } } |
Prize bean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
public class Prize { /** * 獎品唯一標(biāo)示 */ private Integer prizeId; /** * 中獎概率 */ private BigDecimal probability; /** * 獎品數(shù)量 */ private Integer quantity; public Integer getPrizeId() { return prizeId; } public void setPrizeId(Integer prizeId) { this .prizeId = prizeId; } public BigDecimal getProbability() { return probability; } public void setProbability(BigDecimal probability) { this .probability = probability; } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this .quantity = quantity; } } |
3. 測試
prize1概率: 5%
prize2概率: 10%
prize3概率: 15%
prize4概率: 20%
prize5概率: 50%
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
public class Test { public static void main(String[] args) { List<Prize> prizes = new ArrayList<Prize>(); Prize prize1 = new Prize(); prize1.setPrizeId( 1 ); prize1.setProbability( new BigDecimal( 0.05 )); prize1.setQuantity( 1 ); prizes.add(prize1); Prize prize2 = new Prize(); prize2.setPrizeId( 2 ); prize2.setProbability( new BigDecimal( 0.10 )); prize2.setQuantity( 10 ); prizes.add(prize2); Prize prize3 = new Prize(); prize3.setPrizeId( 3 ); prize3.setProbability( new BigDecimal( 0.15 )); prize3.setQuantity( 20 ); prizes.add(prize3); Prize prize4 = new Prize(); prize4.setPrizeId( 4 ); prize4.setProbability( new BigDecimal( 0.20 )); prize4.setQuantity( 50 ); prizes.add(prize4); Prize prize5 = new Prize(); prize5.setPrizeId( 5 ); prize5.setProbability( new BigDecimal( 0.50 )); prize5.setQuantity( 200 ); prizes.add(prize5); int prize1GetTimes = 0 ; int prize2GetTimes = 0 ; int prize3GetTimes = 0 ; int prize4GetTimes = 0 ; int prize5GetTimes = 0 ; Arithmetic arithmetic = new Arithmetic(); int times = 1000 ; for ( int i = 0 ; i < times; i++) { int prizeId = arithmetic.pay(prizes); switch (prizeId) { case 1 : prize1GetTimes++; break ; case 2 : prize2GetTimes++; break ; case 3 : prize3GetTimes++; break ; case 4 : prize4GetTimes++; break ; case 5 : prize5GetTimes++; break ; } } System.out.println( "抽獎次數(shù)" + times); System.out.println( "prize1中獎次數(shù)" + prize1GetTimes); System.out.println( "prize2中獎次數(shù)" + prize2GetTimes); System.out.println( "prize3中獎次數(shù)" + prize3GetTimes); System.out.println( "prize4中獎次數(shù)" + prize4GetTimes); System.out.println( "prize5中獎次數(shù)" + prize5GetTimes); } } |
結(jié)果:
通過1000次抽取,我們看出算法精度還是很高的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。