问题: 编写一个滚动两个骰子的程序,将它们的总和加上36,000,000次,并打印每次计算总和的次数。
所以显然我需要两次获得6个数字的兰特并加上它们 - 循环3600万次,然后获得一个频率计数器,无论多少次找到每个总和(范围从2到12)。
现在鉴于我在Java方面经验不足,我遇到了一些问题。 这是我到目前为止的代码:
package twodice;
import java.util.Random;
public class TwoDice
{
public static void main(String[] args)
{
int sum;
Random randomNumbers = new Random();
int[] frequency = new int[13];
for (int roll = 2; roll <= 36000000; roll++)
{
++frequency[(1 + randomNumbers.nextInt(6)) + (1 + randomNumbers.nextInt(6))];
}
System.out.printf("%s%10s\n", "Face", "Frequency");
for(int face = 1; face < frequency.length; face++)
{
System.out.printf("%4d%10d\n", face, frequency[face]);
}
}
}
输出:
run:
Face Frequency
1 6001537
2 6003025
3 5997753
4 5997647
5 6000769
6 5999269
7 0
8 0
9 0
10 0
BUILD SUCCESSFUL (total time: 0 seconds)
问题在于: 1.显示的总和不是2-12,它们是1-10(正确的数量,不是正确的总和......) 2.频率仅为1-6而不是1-6 + 1-6。
感谢您的所有帮助!
编辑:奥斯卡洛佩兹解决了!非常感谢你!答案 0 :(得分:8)
对于第一个问题,数组的大小错误,这应该解决它:
int[] frequency = new int[13];
索引0
和1
的值也始终为0
,因此循环应从face = 2
开始。对于第二个问题,程序应该模拟投掷两个骰子,而不仅仅是当前的骰子。试试这个:
++frequency[(1 + randomNumbers.nextInt(6)) + (1 + randomNumbers.nextInt(6))];
答案 1 :(得分:1)
同时更改你的for循环。最终代码如下所示:
import java.util.Random;
public class TwoDice
{
public static void main(String[] args)
{
Random randomNumbers = new Random();
int[] frequency = new int[13];
for (int roll = 1; roll <= 36000000; roll++)
{
++frequency[1 + (randomNumbers.nextInt(6)) + (1 + randomNumbers.nextInt(6))];
}
System.out.printf("%s%10s\n", "Face", "Frequency");
for(int face = 2; face < frequency.length; face++)
{
System.out.printf("%4d%10d\n", face, frequency[face]);
}
}
}
我跑了这个,它可以正常运作。