Сложение двух игральных костей 36 миллионов раз

Вопрос: Напишите программу, которая бросает два игральных кубика, складывает их сумму 36 000 000 раз и выводит, сколько раз вычислялась каждая сумма.

Таким образом, очевидно, мне нужно дважды получить ранд для 6 чисел и добавить их - в цикле 36 миллионов раз, а затем получить счетчик частоты, сколько раз каждая сумма была найдена (которая колеблется от 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.

Спасибо за всю твою помощь!

РЕДАКТИРОВАТЬ: Решено Оскаром Лопесом! Большое спасибо!


person VMoza    schedule 13.10.2014    source источник


Ответы (2)


Для первой проблемы массив имеет неправильный размер, это должно исправить:

int[] frequency = new int[13]; 

Также значения индексов 0 и 1 всегда будут 0, поэтому цикл должен начинаться с face = 2. Для решения второй задачи программа должна имитировать бросание двух игральных костей, а не одной, как сейчас. Попробуй это:

++frequency[(1 + randomNumbers.nextInt(6)) + (1 + randomNumbers.nextInt(6))];
person Óscar López    schedule 13.10.2014
comment
Бьюсь об заклад, вы думаете, что вы НАСТОЛЬКО УМНЫ, решая ВСЕ ПРОБЛЕМЫ. Ну ты и есть. - person VMoza; 13.10.2014
comment
Решение сработало отлично, и я очень ценю вашу помощь, мистер Лопес. - person VMoza; 13.10.2014
comment
@VMoza, мне было приятно помочь вам, и, пожалуйста, бросьте часть мистера, мы здесь не такие формальные :) - person Óscar López; 13.10.2014

Также измените цикл 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]);
        }
    }
}

Я запустил это, и это работает так, как вы могли ожидать.

person Alvin Bunk    schedule 13.10.2014
comment
Спасибо Элвин! Я очень ценю вашу помощь. Однако, как говорится, ранняя пташка поймает червяка, так что на этот раз Оскар попался! Но в любом случае, я искренне ценю вашу способность решить эту проблему, особенно потому, что это своего рода альтернативное решение! - person VMoza; 13.10.2014
comment
Можете ли вы хотя бы мой комментарий. Спасибо! - person Alvin Bunk; 13.10.2014
comment
Благодарю вас! Всегда готовы помочь! - person Alvin Bunk; 13.10.2014