Java面试之笔试题分析

  • 题目
写一个验证掷骰子概率的程序,同时投掷 2 颗 6 面骰子 n 次,计算其和得到 各数字的概率
  • 分析
    按照我本人分析步骤,首先分析 计算 2 颗 6 面骰子 得到数字的和 但是和怎么算呢?那就是每次通过随机数生成Random 到1-6之间的数字(new Random ().nextInt(6)+1 )这样代表一个骰子,每次写两次出现的数字加起来就是 2 颗得到数字的和。然后将和做为Map的key,那么Value 就是次数了。第一是1 后续可以使用Java8 Map 新方法merge。 我这里暂时没使用 就是方便理解。外面就是n次循环。这时候map 中已经有n次不同值出现的次数了,下一步就是计算概率。经过分析分母就是n 出现次数就是分子。这个经常打麻将的应该都知道两个都是1 得2,都是6 得12 所以不管多少次他们出现和范围就是2-12。所以根据这个循环计算出每个出现概率。

  • 代码实现

package com.dairuijie.demo.study;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;

/**
 * 
 * @模块名:Day01
 * @包名:com.dairuijie.demo.study
 * @描述:SievesTest.java @版本:1.0
 * @创建人:drj
 * @创建时间:2020年3月28日下午12:35:14
 */
public class SievesTest {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		while (true) {
			try {
				System.out.print("请输入次数:");
				Integer read = Integer.valueOf(scan.nextLine());
				if (read == 0) {
					break;
				}
				System.out.println("输入数据:" + read);
				long s = System.currentTimeMillis();
				Random r = new Random();
				BigDecimal total = new BigDecimal(read);
				Integer temp = 0;
				Map<Integer, Object> hashMap = new HashMap<>();
				for (int i = 0; i < read; i++) {// 6次
					for (int j = 0; j < 2; j++) {// 2 颗
						int key = r.nextInt(6) + 1;
						temp = +key;
						if (hashMap.containsKey(key) && j == 1) {
							hashMap.put(temp, Integer.valueOf(hashMap.get(temp).toString()) + 1);
							temp = 0;
						} else if (j == 1) {
							hashMap.put(temp, 1);
						}
					}
				}
				if (hashMap != null && hashMap.size() > 0) {
					for (int i = 2; i < 13; i++) {
						if (hashMap.get(i) != null) {
							System.err.println(String.format("数字为%s的概率=%s", i,
									(new BigDecimal(Integer.valueOf(hashMap.get(i).toString()))
											.divide(total, 2, BigDecimal.ROUND_HALF_UP).setScale(2))
													.multiply(new BigDecimal(100))
											+ "%"));
						}
					}
				}
				long e = System.currentTimeMillis();
				System.out.println("耗时:" + (e - s) + "ms");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				System.err.println("格式有误!");
			}
		}
		scan.close();
	}

}

  • 结果分析
    在这里插入图片描述
    最后次数越大每个出现概率基本一样。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛乌龟一起走

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值