加两个骰子3600万次

时间:2014-10-13 04:12:43

标签: java dice

问题: 编写一个滚动两个骰子的程序,将它们的总和加上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。

感谢您的所有帮助!

编辑:奥斯卡洛佩兹解决了!非常感谢你!

2 个答案:

答案 0 :(得分:8)

对于第一个问题,数组的大小错误,这应该解决它:

int[] frequency = new int[13]; 

索引01的值也始终为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]);
        }
    }
}

我跑了这个,它可以正常运作。