问题:

一副扑克牌,除去大小王后共52张牌,随机从中抽八张牌,问八张牌的和最有可能是多少?

分析:

这52张牌,其实就是数字 1 2 3 。。。13, 每个数字出现4次。随机抽出8个数,问组成的和最有可能是多少?

很快想到了2种方法:

1.根据 大数定理 ,多次模拟抽牌,求和,看和的分布情况

2.在所有的C(52,8)种情况中,求出所有89(12-100)种情况和的组合数

解法1:

首先生成一副扑克牌,放入list中,每次随机取出一张牌后,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 //随机取出一张牌,并在list集合中去除对应的数

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 //多次重复试验

36 for(int i=0;i<1000000;i++){37 int key=getSum();38 //试验结果存入map中,记录出现的次数

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集合,本来想写一个按值排序的方法,搜了一下,太麻烦,果断放弃,改用excel处理结果

46 for(Integer key:map.keySet()){47 System.out.println(map.get(key)+"\t"+key);48 }49 }50 }

运行5次后,输出结果在excel中排序,如下:

可以看出,和是56的结果最多,大概39800,(只要三万九千八,求和结果带回家。。。),根据大数定理,估计和最可能的数是 56 ,概率约等于 0.0398,

但是,和为57、55出现的次数也比较接近 56 ,是不是概率相等呢?

我们求一下每种情况的准确概率(大数定理只能估算概率),请看解法2。

解法2:

模拟计算机抽牌的每一种情况,求出每一种情况下的和。

1.如果按照每张牌的点数分类的话,每次抽牌都要考虑这张牌的点数 在本次抽牌中 出现的次数,太麻烦,所以对每张牌进行编号(0-51),

问题转化为:在0-51中取出8个不同的数字,并对这8个数字代表的点数 求和。

2.8个数字,8个变量,8次循环,感觉很low啊,不过我没想到好的办法,就先这样吧,希望大家找到好的办法能分享给我。

代码如下:

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 //模拟每一种抽牌结果,low到爆的8次循环

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 //记录抽牌总次数

34 count++;35 //抽牌结果记录到map中,并记录次数

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 }

结果依然是输出到excel中处理,

首先  count====752538150  。。。。。超乎想象的大,看来解法一中的循环次数还是太少。

用C(52,8)计算了下,这个结果没错

概率计算结果

得到和为 56 的概率为 0.039791 ,和解法1中估算的值 0.0398 比较接近了

和为55、57的概率同为 0.039601 ,与和为 56 的概率差距真的很小了,

就这样了

java扑克牌抽牌_[java,2018-06-26] 扑克牌抽牌求和问题相关推荐

  1. java 基础面试 英文_[Java面试] 面试java基础总结大全

    原标题:[Java面试] 面试java基础总结大全 基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. ...

  2. java 内存泄露 书籍_[Java教程]一次艰难的内存泄露排查,BeanUtils 的锅

    [Java教程]一次艰难的内存泄露排查,BeanUtils 的锅 0 2020-10-29 18:24:42 现象 通过jstat -gcutil pid 5000 ,发现fgc次数很多而且频繁,此时 ...

  3. java 历遍 类_[Java] 遍历指定包名下所有的类(支持jar) | 学步园

    项目需要,仅做记录. 支持包名下的子包名遍历,并使用Annotation(内注)来过滤一些不必要的内部类,提高命中精度. 通过Thread.currentThread().getContextClas ...

  4. java privatekey输出字符串_[Java教程]根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象_星空网...

    根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象 2012-05-29 0 1.字符串生成公钥对象 PublicKey /** * 实例化公钥 * * @re ...

  5. java视、频_[java视频]感人故 事视 频网 站上那找~~~

    感人故 事视 频网 站上那找~~~ 问题补充:感人故 事视 频网 站上那找~~~ ●呵呵,你问对人了,感人故事就去"新浪show",现在是新浪期下的网站,运行稳定,观看流畅,上传简 ...

  6. java 图片宽高_[Java]获取图片高和宽

    通过javax.imageio.ImageIO类中的read()函数读取的图片,存放在类java.awt.image.BufferedImage类中.调用BufferedImage类中的getWidt ...

  7. java语言金山打字_[Java教程]java实现 swing模仿金山打字 案例源码

    [Java教程]java实现 swing模仿金山打字 案例源码 0 2014-11-17 12:00:21 java实现 swing模仿金山打字 案例源码,更多Java技术就去Java教程网.http ...

  8. java实现计算器框架_[Java小程序] 实现简单计算器

    这学期没事学了一点点Java,想写个程序练手,因为只学了一点点,所以暂时只能先写个实现简单功能的计算器练练.感觉写完后不是很好,如果路过的哪位高手给点建议,小弟万分感激啊. 由于期末来了,没太多时间, ...

  9. java 字符串格式替换_[Java] - 格式字符串替换方法

    Java 字符串格式替换方法有两种,一种是使用String.format(...),另一种是使用MessageFormat.format(...) 如下: import java.text.Messa ...

最新文章

  1. 阿里达摩院 AI医疗 「铸剑」四年:上线170家医院,落地57座城市
  2. Java 虚拟机总结给面试的你(中)
  3. python免费入门教程-python小白如何入门,第一步要做什么?(附带免费教程)
  4. 学习笔记:文本过滤_____unix 下的通配符
  5. 我的linkedin profile
  6. Activemq实战
  7. 数字电视系统显示格式标准(D1/D2/D3/D4/D5)对比解释
  8. 生物医学信号检测与处理实验3——1微电阻梁
  9. 人民币大写转换 java_java人民币转大写中文
  10. dell服务器T420装系统,ThinkPad T420笔记本一键u盘装系统win7教程
  11. Javascript Yielding Processes 定时器数组分块技术
  12. 小程序二维码需要发布正式版后才能获取到_很意外!iOS 14.1正式版已出,修复多处问题...
  13. JQuery事件绑定解绑方法小结
  14. springboot+mybatis 利用PageHelper插件分页,结果第二页的返回分页信息还是和第一页一样。
  15. 易班自动打卡+钉钉机器人消息提醒
  16. Android9 HWbinder使用-注册service流程解析
  17. 虚拟运营商APN、SPN参数、Sim卡名称
  18. Facebook商务管理插件怎么使用
  19. mysql对称_对于《由对称性解2
  20. PYthon--(文件I/O)

热门文章

  1. app启动页数秒加载 代码_干货 | App 自动化测试痛点(弹框及首页启动加载完成判断处理)
  2. python从零开始的学习-python学习过程之从零开始
  3. 图解ARP协议(四)代理ARP原理与实践(“善意的欺骗”)
  4. 物联网平台存量设备如何一键迁移企业版实例
  5. 给运维工程师的Cheatsheets! 《Shell脚本速查手册》免费下!
  6. 数据与知识管理属于计算机科学研究方向中的,知识管理技术与应用
  7. mysql 字符串转时间yymmdd_mysql 日期和时间格式转换实现语句 | 很文博客
  8. 《盗墓笔记》使用的这套技术,让美术可以在场景中任意使用灯光
  9. 设计面向游戏的人工智能(三):战术和战略人工智能 (AI)
  10. Linux磁盘分区了解多少?Linux入门必看