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();
	}

}

  • 結果分析
    在這裏插入圖片描述
    最後次數越大每個出現概率基本一樣。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章