Рейтинг:
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
Привет Грег Ютас,
Спасибо за помощь.