目标是近似投掷两个骰子的概率,以获得骰子总数的特定组合。我可以通过经验测试方法来做到这一点,(收集真实数据……(这意味着,我必须运行一个模拟,投掷两个骰子,并记录数字实际出现的次数。为了能够得到真实概率的合理近似值,我需要多次掷骰子。(在这种情况下是20000次(
-
我的程序还需要询问用户他们希望测试的骰子总数,然后生成并计算前面提到的20000次骰子投掷的结果。为了帮助用户了解概率是如何收敛的,我需要在每1000次投掷后打印运行概率。
-
在格式方面,我必须显示允许6位数的骰子投掷次数,并在小数点后显示精度为5位数的概率结果。
-
最后,赋值明确指出我不应该用";如果";语句,因为我需要能够在不更改代码的情况下更改骰子投掷的次数并获得正确的显示。
示例运行:
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++;
}
}
}
我遇到的问题是,我无法想出一种在代码中表示概率公式的方法。因此,即使我没有语法或运行时错误,我也无法产生甚至非常接近"概率"列的结果;示例运行";在上面不幸的是,与我的一些同学不同,我这学期没有上统计学课,因此缺少一个">组合数学与概率导论";无可否认,在这种情况下,这将非常有用!
对于这门特定的课程,我们还没有学会如何使用数组或数组列表,因此这也是我没有将它们包含在代码中的原因。然而,我在网上找到了一个二项式概率公式,我很好奇是否以及如何将其合并(用我各自的变量代替公式中引用的变量(。
如果任何答案超出了基本的编程概念,请回答者解释如何将其与基本概念联系起来,甚至提供一个资源链接来帮助解释它吗?例如,解释java.util.Random
类是表示基本(int)(Math.random() * x)
的更方便的方式。这对我的理解真的很有帮助!
关于您的代码的一些备注:
随机变量的声明应该在循环之外完成。无论何时在java中使用新操作符,都会创建一个对象。由于循环运行了几次(在您的情况下是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));
}
}
}
}