lelouch_vi 2 Ответов: 2

Частота чисел в массиве


Привет, у меня есть друг, у которого есть этот код.

import java.util.*;
public class JavaRandomMath {

	
	public static void main (String [] args)
	{
	
		
		Random rand = new Random();
		
		int freq[] = new int [5];
		
		for (int roll = 0; roll <= 5; roll++)
		{
			
			++freq[1 + rand.nextInt(4)];
			
		}
		
	
		System.out.println("Face\tFrequency");
		
		
	for (int face = 0; face < freq.length; face++)
		{
			
			System.out.println(face + "\t" + freq[face]);
			
		}	
		
		
	}

}


Я пытался понять это сам и могу довольно хорошо понять все остальное кроме этой одной строки
++freq[1 + rand.nextInt(4)];
который находится в первом цикле for.

Что я уже пробовал:

Я попытался использовать там точку останова, чтобы увидеть, что происходит позади.Что я могу понять из отладчика, так это то, что каждый раз, когда первый цикл for циклически повторяется, индексам массива freq присваивается новое значение с помощью random.nextInt.

Чего я не могу понять, так это всей линии. ++Freq действительно сбивает меня с толку. Похоже, что он увеличивается? а после ++freq стоит скобка [], которая имеет это внутри
1 + rand.nextInt(4)
Я уже читал документы случайного класса в java. 1 там, возможно, используется для добавления к сгенерированному числу, но почему он должен быть внутри этого [] и что означает ++freq перед []?

2 Ответов

Рейтинг:
9

OriginalGriff

Просто чтобы добавить к ответу Грега, если вы не понимаете строку кода, разбейте ее:

++freq[1 + rand.nextInt(4)];
Становится
int index = 1 + rand.nextInt(4);
++freq[index];
Становится
int randomValue = rand.nextInt(4);int index = 1 + randomValue;
freq[index] += 1;
Становится
int randomValue = rand.nextInt(4);
int index = 1 + randomValue;
freq[index] = freq[index] + 1;

Теперь это очевидно:
Сгенерируйте случайное число, которое вписывается в массив
Добавьте к этому еще одну.
Добавьте один к этому элементу массива.

Однако этот плохой код: хотя rand.nextInt(n) возвращает значение между 0 и (n - 1) включительно (см. документацию: Java.util.Random.nextInt() в Java - GeeksforGeeks[^]) добавление единицы к нему означает, что он использует только элементы 1, 2, 3 и 4 массива - значение в индексе 0 всегда будет равно нулю.
Лучшим решением было бы:
++freq[rand.nextInt(freq.length)];
Так как это будет генерировать значения, которые могут быть любым индексом в массиве, независимо от размера массива.


lelouch_vi 2

Привет OriginalGriff,

Спасибо, что взломали код. Я его изучаю.
Спасибо за это:

int randomValue = rand.nextInt(4);int index = 1 + randomValue;freq[index] = freq[index] + 1;


Я просто хочу кое-что прояснить. Эта линия
freq[index] = freq[index] + 1;

означает ли это, что индекс, который будет хранением сгенерированного числа, также будет случайным? Я правильно говорю? Я добавляю туда точку останова и наблюдаю за тем, что происходит позади. Хранение случайного числа иногда начинается с индекса 3, 2, 4?

OriginalGriff

Вы не "храните" случайное число - вы используете его, чтобы определить, какой "столбец" массива подсчитывает их.

Попробуйте это на бумаге и посмотрите, что делает sit более ясным - это довольно трудно объяснить, не будучи в состоянии увидеть, в какой момент ваши глаза стекленеют. :смеяться:

lelouch_vi 2

Привет OriginalGriff,

Я уже подготовил этот ваш ответ вчера вечером и пытался понять это.

Как ты и сказал
Вы не "храните" случайное число - вы используете его, чтобы определить, какой "столбец" массива подсчитывает их.

В линии:

++freq[1 + rand.nextInt(4)];


То [1 + rand.nextInt(4)] действует как индекс массива freq, потому что он находится внутри [ ]. Поскольку я использую random.nextInt внутри [], он генерирует случайный индекс для freq? Вот почему ты сказал: вы используете его, чтобы определить, какой "столбец" массива подсчитывает их.

Поскольку внутри [ ] есть 1, то теперь можно получить доступ к 4-му индексу массива freq?

То ++частота увеличивает элемент индекса (который генерируется случайным образом). Итак,
[1 + rand.nextInt(4)] не имеет ничего общего со значением массива, он просто генерирует индекс для массива(случайным образом).

То ++частота это тот, кто отвечает за значения, потому что он увеличивает значение того, где индекс, при котором генерируется rand.nextInt(4).

Итак, если я хочу увеличить числа внутри каждого элемента, я должен увеличить условие цикла for? например, поднять его до
ролл < 1000?? Правильно ли это делать?

Надеюсь, теперь мои глаза остекленели в нужном месте, ха-ха.

OriginalGriff

Да. Это правильно, и правильный способ увеличить частоту.

Но прочтите то, что я сказал еще раз, особенно последний бит, начиная с "Однако"

lelouch_vi 2

Однако этот плохой код: хотя rand.nextInt(n) возвращает значение от 0 до (n - 1) включительно (см. документацию: Java.util.Random.nextInt() в Java - GeeksforGeeks[^]) добавление единицы к нему означает, что он использует только элементы 1, 2, 3 и 4 массива - значение в индексе 0 всегда будет равно нулю.

Да, спасибо. Прежде чем я пришел сюда, я уже читал документы о случайном классе.



Эта линия:

++freq[rand.nextInt(freq.length)];

это действительно лучшее решение для этого.

Большое вам спасибо OriginalGriff

OriginalGriff

Всегда пожалуйста!

Рейтинг:
18

Greg Utas

Ты прав, тот самый ++ это операция инкремента.

freq[4] это массив из пяти целых чисел, проиндексированных от 0 до 4.

rand.nextInt(4) говорит: "Дайте мне следующее случайное целое число от 0 до 4."

Когда это число возвращается, его индекс в поле freq массив инкрементируется. Это подсчитывает количество раз, когда появлялось каждое число.


Richard Deeming

Следующее случайное целое число из 0 к 3, верно? Верхняя граница является эксклюзивной, поэтому она никогда не вернется 4.

Random (Java Platform SE 7 )[^]

Greg Utas

Да, я вернулся, чтобы посмотреть на него снова после того, как вспомнил 1+ и понял, что это было подозрительно. Но к тому времени OriginalGriff уже разобрался с этим, так что я не стал менять свое решение.

lelouch_vi 2

Привет Грег Ютас,

Спасибо за объяснение.
Когда это число возвращается, его индекс в массиве freq увеличивается.

Я все еще путаюсь с ++freq, хотя OriginalGriff уже разбивает код.
Это действительно выглядит увеличивающимся, но когда я добавил точку останова в цикле for, хранение случайного числа иногда также начинается со случайных индексов.

Greg Utas

На самом деле я не использую Java, но она выглядела достаточно похожей на C++, чтобы я мог ответить. Если индекс является случайным, то я предполагаю, что иногда он будет выходить за пределы границ, и в этом случае я считаю, что Java вызовет исключение. Это то, что происходит? Кроме того, если вы изменили эту строку кода, пожалуйста, включите новую версию.

lelouch_vi 2

Привет Грег Ютас,

Спасибо за помощь.