在不使用数组列表的情况下计算 Java 中的概率?

Calculating probability in Java without the use of array lists?

目标是估算投掷两个骰子以获得特定骰子总数组合的概率。我将能够通过经验测试方法(收集真实数据...)来做到这一点,这意味着,我将不得不 运行 进行一次模拟,抛出两个骰子并记录实际出现的次数。为了能够得到真实概率的合理近似值,我需要多次掷骰子。 (本例中为 20,000 次)

  1. 我的程序还需要询问用户他们希望测试的骰子总数是多少,然后生成并计算前面提到的 20,000 次掷骰的结果。为了帮助用户了解概率是如何收敛的,我需要在每 1000 次抛出后打印 运行ning 概率。

  2. 在格式上,我必须显示允许6位数的掷骰数,以及显示小数点后5位精度的概率结果。

  3. 最后,作业明确指出我不应该用“if”语句对输出显示进行编码,因为我需要能够更改掷骰数并获得正确的显示而无需更改代码。

示例运行:

Probability Testing Program

What die total do you wish to test for (2-12): 7

Computed probability for die throw = 7

Die throws     Probability
      1000     0.16000 
      2000     0.16950 
      3000     0.16467 
      4000     0.16850 
     ...
     18000     0.16611 
     19000     0.16695 
     20000     0.16685 

我写的重现解决方案的代码如下:

import java.util.Random;
import java.util.Scanner;

/**
 * SRN: 507-147-9
 */
public class Lab7Part2 {

    public static void main(String[] args) {

        // new input
        Scanner input = new Scanner(System.in);

        // Define vars
        int rolls = 1, dice1, dice2, total, sum;
        long landmark;
        double probability = 0;

        // Name of program
        System.out.println("Probability Testing Program");
        System.out.println();
        System.out.print("What die total do you wish to test for (2-12): "); // prompt total dice rolls
        total = input.nextInt(); // store input as "total"
        System.out.println();
        System.out.println("Computed probability for die throw = " + total);
        System.out.println();
        System.out.println("Die throws     Probability");

        landmark = 1000;

        while ((rolls <= 20000) && (landmark <= 20000)) {

            //Roll 2 random dice
            Random d1 = new Random();
            dice1 = 1 + d1.nextInt(6); // dice1 = 1 + (int)(Math.random() * 6);
            dice2 = 1 + d1.nextInt(6); // dice2 = 1 + (int)(Math.random() * 6);

            // The sum of the 2 dice rolls
            sum = dice1 + dice2;

            if (sum == total) {

                // calculating probability goes here??
                // probability = (math equation) ;
            }

            if (rolls == landmark) {
                System.out.printf("     %5d     %6.5f \n", landmark, probability);
                landmark = landmark + 1000;
            }

            rolls++;
        }
    }
}

我遇到的问题是,我无法在我的代码中想出一种表示适用于我的概率公式的方法。因此,即使我没有语法或 运行 时间错误,我也无法生成与上面“示例 运行”中的概率列相差甚远的结果。不幸的是,与我的一些 class 伙伴不同,我这学期不在统计 class 中,因此缺少“组合学和概率导论 ” , 在这种情况下会非常有用!

对于这个特定的课程,我们还没有学习如何使用数组或数组列表,因此我没有将它们包含在我的代码中。然而,我在网上找到了一个 Binomial Probability Formula,我很好奇我是否以及如何将它合并(用我各自的变量代替公式中引用的变量)。

如果有任何答案超出了基本的编程概念,请回答者解释如何将其与基本概念联系起来,或者甚至提供 link 资源来帮助解释它?例如,解释 java.util.Random class 是表示基本 (int)(Math.random() * x) 的更方便的方式。这对我的理解很有帮助!

关于您的代码的一些评论:

随机变量的声明应该在循环之外完成。每当您在 java 中使用 new 运算符时,您都会创建一个对象。由于循环 运行 多次(在您的情况下为 20000 次),您还创建了 20000 个没有用的对象。但是如果你在循环之前这样做,只会创建一个对象,你可以反复使用它。

对于此任务,您不需要更深入的统计知识。对于该任务,您只需要来自描述性统计的方法,而不需要来自推论统计的方法。您应该计算简单地通过除以 favourable events / all events 计算得出的经验概率。为此,您只需要一个计数器来记住随机抛出的数字与所需总和相对应的频率。为此目的,使用 for 循环而不是 while 循环也会更容易。

您可以使用 DecimalFormatter 并以所需的小数位显示概率。

我已经根据我的意见和建议修改了您的代码,并删除了一些不必要的变量。

import java.text.DecimalFormat;
import java.util.Random;
import java.util.Scanner;

public class Lab7Part2 {

    public static void main(String[] args) {
        // new input
        Scanner input = new Scanner(System.in);
        // Define vars
        int dice1, dice2, total;
        long landmark = 1_000;;
        double probability = 0;
        int trials = 40_000;
        int countOfTotal = 0;
        DecimalFormat df = new DecimalFormat("#.#####");

        // Name of program
        System.out.println("Probability Testing Program");
        System.out.println();
        System.out.print("What die total do you wish to test for (2-12): "); // prompt total dice rolls
        total = input.nextInt(); // store input as "total"
        System.out.println();
        System.out.println("Computed probability for die throw = " + total);
        System.out.println();
        System.out.println("Die throws     Probability");

        Random rand = new Random();
        for (int i = 1; i <= trials; i++) {
            dice1 = 1 + rand.nextInt(6);
            dice2 = 1 + rand.nextInt(6);
            if (dice1 + dice2 == total) {
                countOfTotal++;
            }
            if (i % landmark == 0) {
                probability = (double) countOfTotal / i;
                System.out.printf("     %5d     %-6s \n", i, df.format(probability));
            }
        }
    }
}