java扑克牌抽牌_[java,2018-06-26] 扑克牌抽牌求和问题
問(wèn)題:
一副撲克牌,除去大小王后共52張牌,隨機(jī)從中抽八張牌,問(wèn)八張牌的和最有可能是多少?
分析:
這52張牌,其實(shí)就是數(shù)字 1 2 3 。。。13, 每個(gè)數(shù)字出現(xiàn)4次。隨機(jī)抽出8個(gè)數(shù),問(wèn)組成的和最有可能是多少?
很快想到了2種方法:
1.根據(jù) 大數(shù)定理?,多次模擬抽牌,求和,看和的分布情況
2.在所有的C(52,8)種情況中,求出所有89(12-100)種情況和的組合數(shù)
解法1:
首先生成一副撲克牌,放入list中,每次隨機(jī)取出一張牌后,list remove該元素,代碼如下:
1 packagetest;2
3 importjava.util.ArrayList;4 importjava.util.HashMap;5 importjava.util.List;6 importjava.util.Map;7
8 public classLargeNumbersTest {9
10 public static intgetSum() {11 //生成一副撲克牌,放入list
12 List list=new ArrayList();13 for(int i=1;i<14;i++){14 list.add(i);15 list.add(i);16 list.add(i);17 list.add(i);18 }19
20 int[] a=new int[8];21 for(int i=0;i<8;i++){22 int random=(int)(Math.random()*list.size());23 //隨機(jī)取出一張牌,并在list集合中去除對(duì)應(yīng)的數(shù)
24 a[i]=list.get(random);25 list.remove(random);26 }27 int sum=0;28 for(int i=0;i map=new HashMap();35 //多次重復(fù)試驗(yàn)
36 for(int i=0;i<1000000;i++){37 int key=getSum();38 //試驗(yàn)結(jié)果存入map中,記錄出現(xiàn)的次數(shù)
39 if(map.keySet().contains(key)){40 map.put(key, map.get(key)+1);41 }else{42 map.put(key, 1);43 }44 }45 //輸出map集合,本來(lái)想寫一個(gè)按值排序的方法,搜了一下,太麻煩,果斷放棄,改用excel處理結(jié)果
46 for(Integer key:map.keySet()){47 System.out.println(map.get(key)+"\t"+key);48 }49 }50 }
運(yùn)行5次后,輸出結(jié)果在excel中排序,如下:
可以看出,和是56的結(jié)果最多,大概39800,(只要三萬(wàn)九千八,求和結(jié)果帶回家。。。),根據(jù)大數(shù)定理,估計(jì)和最可能的數(shù)是 56 ,概率約等于 0.0398,
但是,和為57、55出現(xiàn)的次數(shù)也比較接近 56 ,是不是概率相等呢?
我們求一下每種情況的準(zhǔn)確概率(大數(shù)定理只能估算概率),請(qǐng)看解法2。
解法2:
模擬計(jì)算機(jī)抽牌的每一種情況,求出每一種情況下的和。
1.如果按照每張牌的點(diǎn)數(shù)分類的話,每次抽牌都要考慮這張牌的點(diǎn)數(shù) 在本次抽牌中 出現(xiàn)的次數(shù),太麻煩,所以對(duì)每張牌進(jìn)行編號(hào)(0-51),
問(wèn)題轉(zhuǎn)化為:在0-51中取出8個(gè)不同的數(shù)字,并對(duì)這8個(gè)數(shù)字代表的點(diǎn)數(shù) 求和。
2.8個(gè)數(shù)字,8個(gè)變量,8次循環(huán),感覺(jué)很low啊,不過(guò)我沒(méi)想到好的辦法,就先這樣吧,希望大家找到好的辦法能分享給我。
代碼如下:
1 packagetest;2
3 importjava.util.ArrayList;4 importjava.util.HashMap;5 importjava.util.List;6 importjava.util.Map;7
8 public classPokerTest {9 public static voidmain(String[] args) {10 //生成一副撲克牌,放入list
11 List list=new ArrayList();12 for(int i=1;i<14;i++){13 list.add(i);14 list.add(i);15 list.add(i);16 list.add(i);17 }18 int count=0;19 Map map=new HashMap();20 //模擬每一種抽牌結(jié)果,low到爆的8次循環(huán)
21 for(int a1=0;a1<45;a1++){22 for(int a2=a1+1;a2<46;a2++){23 for(int a3=a2+1;a3<47;a3++){24 for(int a4=a3+1;a4<48;a4++){25 for(int a5=a4+1;a5<49;a5++){26 for(int a6=a5+1;a6<50;a6++){27 for(int a7=a6+1;a7<51;a7++){28 for(int a8=a7+1;a8<52;a8++){29 int sum=list.get(a1)+list.get(a2)30 +list.get(a3)+list.get(a4)31 +list.get(a5)+list.get(a6)32 +list.get(a7)+list.get(a8);33 //記錄抽牌總次數(shù)
34 count++;35 //抽牌結(jié)果記錄到map中,并記錄次數(shù)
36 if(map.keySet().contains(sum)){37 map.put(sum, map.get(sum)+1);38 }else{39 map.put(sum, 1);40 }41 }42 }43 }44 }45 }46 }47 }48 }49 for(Integer key:map.keySet()){50 System.out.println(map.get(key)+"\t"+key);51 }52 System.out.println("count===="+count);53 }54
55 }
結(jié)果依然是輸出到excel中處理,
首先? count====752538150? 。。。。。超乎想象的大,看來(lái)解法一中的循環(huán)次數(shù)還是太少。
用C(52,8)計(jì)算了下,這個(gè)結(jié)果沒(méi)錯(cuò)
概率計(jì)算結(jié)果
得到和為 56 的概率為 0.039791 ,和解法1中估算的值 0.0398 比較接近了
和為55、57的概率同為 0.039601 ,與和為 56 的概率差距真的很小了,
就這樣了
總結(jié)
以上是生活随笔為你收集整理的java扑克牌抽牌_[java,2018-06-26] 扑克牌抽牌求和问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python apache配置_Apac
- 下一篇: java ueditor 图片上传加水印