Javaインタビューで書かれたテストの質問の分析

  • トピック
写一个验证掷骰子概率的程序,同时投掷 2 颗 6 面骰子 n 次,计算其和得到 各数字的概率
  • 分析
    私自身の分析手順に従って、最初に2つの6面サイコロで得られた数値の合計を分析して計算しますが、合計を計算するにはどうすればよいですか?つまり、乱数を使用してランダムと1〜6の間の数値を生成するたびに(新しいランダム().nextInt(6)+1)、これはサイコロを表します。また、2回出現する数値の合計は2を取得して、数を取得します。合計。次に、合計をマップのキーとして使用します。値は回数です。1つ目は1つ後で、新しいJava8Mapメソッドのマージを使用できます。わかりやすいので、とりあえずここでは使用していません。外側はnサイクルです。現時点では、マップにはすでに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();
	}

}

  • 結果分析
    ここに画像の説明を挿入
    最後の回数が多いほど、各発生の確率は基本的に同じです。

おすすめ

転載: blog.csdn.net/qq_29897369/article/details/105174635