2015-01-10 3 views
0

Может ли кто-нибудь объяснить, что делает ++freq в моей данной программе ниже?Приращение в моем массиве Java

package array; 

import java.util.Random; 

public class CounterArray { 
    public static void main(String[] args){ 
     Random Ran = new Random(); 
     int freq[] = new int [7]; 

     for(int roll=1;roll<100;roll++){ 
      ++freq[1+Ran.nextInt(6)]; 
     } 
      System.out.println("face\tFrequency"); 
     for(int face=1;face<freq.length;face++){ 
      System.out.println(face+"\t"+freq[face]); 
     } 
    } 
} 

ответ

5

Что программа делает это «прокатку кости» 99 раз (который пахнет «от одной» ошибки) и подсчитывайте, как часто каждый номер был найден. Массив freq занимает в позиции i, как часто i был нарезанным кубиками.

Этот код генерирует следующее случайное число и затем увеличивает соответствующий интервал в массиве.

++freq[1 + Ran.nextInt(6)]; 

Становится яснее, если разбить его.

  • Сначала оценивается Ran.nextInt(6), которое дает случайное целое из множества {0, 1, 2, 3, 4, 5}. К этому добавляется 1, чтобы получить номер из набора {1, 2, 3, 4, 5, 6}. Давайте сохраним этот промежуточный результат в отдельной переменной для четкости: int result = Ran.nextInt(6) + 1.
  • Затем соответствующая частота просматривается в массиве и увеличивается на единицу. ++freq[result], что имеет такой же эффект, как к freq[result] += 1.

Длина массива freq была сделана равной 7, поэтому можно использовать «естественный» индекс. То есть элемент freq[0] растрачивается. (Я сомневаюсь, что это очень хороший стиль.)

Другое слово по стилю: Общепринято практика резервирования имен капитала для типов, а не использовать их для переменных, так Ran действительно должны быть названы ran, чтобы избежать путаницы.

Еще одно дополнение: Разница между оператором после приращения как в i++ и оператор предварительно приращение, как в ++i является то, что результат прежнего выражения является значение iперед тем приращение а второе - значением после приращением. В вашем случае это не имеет значения, потому что вы все равно не используете результат. Чтобы увидеть, как это работает, попробуйте запустить следующий код:

int i = 10; 
System.out.printf("i = %d%n", i); 
System.out.printf("i++ = %d%n", i++); 
System.out.printf("i = %d%n", i); 
System.out.printf("++i = %d%n", ++i); 
System.out.printf("i = %d%n", i); 
+0

Great , просто, что, если вместо '++ freq [1 + Ran.nextInt (6)] использовать' freq [1 + Ran.nextInt (6)] ++'', это влияет на механизм получения случайного числа между 1 ..6 или нет, они одинаковы? – jfun

+0

@FarhangAmary Я обновил свой ответ с объяснением. – 5gon12eder

+0

* «Я сомневаюсь, что это очень хороший стиль». * - +1 –

1

Это оператор приращения и поведение будет иметь следующий вид:

int temp = 1+Ran.nextInt(6); 
freq[temp] = freq[temp] + 1; 

Часть, Ran.nextInt(6) будет генерировать число между 0 и 5. Таким образом, 1+Ran.nextInt(6) возвратит число от 1 до 6 Код будет использовать это число в качестве индекса массива, чтобы найти, какой элемент должен быть увеличен на 1.

+3

Это неверно, потому что 'Ran.nextInt (6)' очень вероятно будет возвращать разные ответы каждый раз, когда вы вызываете. – 5gon12eder

+0

все еще я не могу получить его :( –

+0

Это все еще неправильно. Это должно быть 'freq [temp] = freq [temp] + 1;' после вашего определения 'temp'. – ale64bit

1

Он просто увеличивает на одно значение в позиции массива, полученное 1+Ran.nextInt(6). В более «описательном» способе вы можете интерпретировать его как симуляцию того, что лицо, которое вы получили, было 1+Ran.nextInt(6), и поэтому частота этого лица увеличивается на единицу.

2

Он увеличивает один случайный элемент из массива freq.

++freq[1+Ran.nextInt(6)]; 

Ran.nextInt(6) часть получает случайное число в диапазоне от 0 до 5. 1+ часть добавляет один к случайному числу. Так что если случайное число говорит, 3, у вас есть ++freq[4] (после добавления). Так как freq[4] - это целая ссылка, вы можете увеличить его. Используя префикс ++, вы говорите «добавьте одно к тому, что число приходит за мной, и установите/верните его».

Итак, что вы делаете, найти случайный элемент в массиве и его приращение на 1.

1

Вы должны знать кое-что о некоторых элементах, используемых: увеличивает

  • Оператор ++ предыдущей или следующей переменной.
  • Метод Random.nextInt(int) возвращает целое число.
  • У вас есть несколько операций в этой строке: ++freq[1+Ran.nextInt(6)].

Что происходит:

  1. Random.nextInt(6) возвращает любое целое число от 0 до 5, говорят 4.
  2. С помощью этого сниппета: 1 + Ran.nextInt(6), вы увеличиваем 4 с 1, что приводит к 5.
  3. Итак, вы вызываете индекс 5 массива целых чисел freq.
  4. Поскольку вы только инициализировали размер массива и не задавали никаких значений, все значения по умолчанию равны 0a.
  5. freq[5] возвращает 0, так как значение позиции 5 массива freq составляет 0a.

Если переписать фрагмент ++freq[1+Ran.nextInt(6)], он будет выглядеть следующим образом:

int diceResult = Ran.nextInt(6); // Returns, say, 4 
int index = 1 + diceResult; // We increment dice result by 1 
freq[5] = freq[5] + 1; 

Конечно, когда цикл повторяется, эти значения могут быть больше 0.

Смежные вопросы