2013-06-16 21 views
0

Я проверяю частоту итогов костей после 36 миллионов рулонов. Я планировал сделать массивList и использовать его в качестве системы подсчета, когда появился один из 11 результатов. Как добавить 1 к одному из элементов в списке?добавление 1 к элементу ArrayList

int die1, die2, dicetotal; 

ArrayList<Integer> results = new ArrayList<Integer>(); 
results.add(0); //for the 11th 

for(int i = 0; i < 36000000; i++){ 
      die1 = (int)(Math.random() * 6) + 1 
      die2 = (int)(Math.random() * 6) + 1 
      dicetotal = die1 + die2; 

      Switch (dicetotal){ 
       case 2: results.set(0, CURRENT + 1); 
       ... 
       ... 
       ... 

     } 
+1

Почему ArrayList, а не только 'int []'? –

+0

idk, это в текущей главе, в которой я работаю, и я подумал, что было бы неплохо включить ее. Не могли бы вы показать возможность с помощью int []? –

ответ

2

ArrayList будет излишним для этого. Но если вам нужно (непроверенный код)

Сначала инициализируйте ваш массив, чтобы содержать 13 элементов (от 0 до 12), чтобы IndexOutOfBoundsException не появлялся. Они будут инициализированы до нуля.

results = new ArrayList<Integer>(13); 

Тогда просто получить элемент, добавьте, и установите его

results.set(dicetotal, results.get(dicetotal) + 1); 

В самом деле, вы должны просто использовать int[], если вы знаете размер массива заранее, и выиграл» t во время программы. Они быстрее, чем ArrayList.

// initialize 
results = new int[13]; 
// could be new int[11]; if you put results in array elements 0 to 10. 

// ... 

// add to tally 
results[dicetotal]++; 

// or, instead, pack the array because dice roll results can only be in 2 to 12. 
// Put such results in array element 0 to 10, 
// by subtracting 2 to the index before putting in 
results[dicetotal - 2]++; 
+0

Спасибо тонну! Определенно помогли. –

1

Было бы разумнее хранить частоты в массиве целых чисел. С одной стороны, было бы гораздо проще увеличить значение для конкретного результата:

int[] frequencies = new int[11]; // sum of two dice can be 2-12 

for(int i = 0; i < 36000000; i++){ 
    die1 = (int)(Math.random() * 6) + 1 
    die2 = (int)(Math.random() * 6) + 1 
    dicetotal = die1 + die2; 

    // increment frequency: 
    frequencies[dicetotal-2] = frequencies[dicetotal-2]+1; 
} 

Теперь ваши частоты массива имеет частоту кость результате двух с индексом 0.

+0

диапазон '2-12' включен, поэтому массив должен иметь 11 элементов, а не 10. – luiges90

+0

Да. Не обращал на это внимания. Спасибо, @ luiges90. –

+0

Размер массива должен быть 11 или он получит AIOBE, когда dicetotal = 12 – darijan

1

Используйте фиксированный размер массив для 11 возможных баллов вы можете получить:

int die1, die2, dicetotal; 

int[] totals= new int[11]; 
for(int i = 0; i < 36000000; i++){ 
    die1 = (int)(Math.random() * 6) + 1 
    die2 = (int)(Math.random() * 6) + 1 
    dicetotal = die1 + die2; 

    //just increment the right position 
    totals[dicetotal-2]++; 
} 
+0

У меня было что-то еще в виду. Изменил его через несколько секунд, но вы, похоже, поймали его. :) – darijan

0

Это может показаться излишним, но для создания обертки для счетчика, так что вы можете хранить его в карте будет сделать код немного легче на Эйсе и легче расширить.

public static class Count { 
    private int count = 0; 

    public int getCount() { 
     return count; 
    } 

    public void increment() { 
     count++; 
    } 

    @Override 
    public String toString() { 
     return "" + count; 
    } 
} 

public static void main(String[] args) { 
    Map<Integer, Count> diceHistogram = new HashMap<>(); 
    for (int i = 2; i <= 12; i++) { 
     diceHistogram.put(i, new Count()); 
    } 

    for (int i = 0; i < (1E+6); i++) { 
     int diceOne = rnd.nextInt(6) + 1; 
     int diceTwo = rnd.nextInt(6) + 1; 
     int sum = diceOne + diceTwo; 

     diceHistogram.get(sum).increment(); 
    } 

    System.out.println(diceHistogram); 
} 

Выводит количество встречных событий для каждой комбинации кубиков.

2=28043, 3=55745, 4=83489, 5=110517, 6=138823, 7=166928, 8=138466, 9=111321, 10=83532, 11=55469, 12=27667 
Смежные вопросы