Класс Random
Класс java.util.Random представляет собой генератор псевдослучайных чисел.
Класс представлен двумя конструкторами
- Random() — создаёт генератор чисел, использующий уникальное начальное число
- Random(long seed) — позволяет указать начальное число вручную
Так как класс создаёт псевдослучайное число, то задав начальное число, вы определяете начальную точку случайной последовательности. И будете получать одинаковые случайные последовательности. Чтобы избежать такого совпадения, обычно используют второй конструктор с использованием текущего времени в качестве инициирующего значения.
- boolean nextBoolean() — возвращает следующее случайное значение типа boolean
- void nextBytes(byte[] buf) — заполняет массив случайно созданными значениями
- double nextDouble() — возвращает следующее случайное значение типа double
- float nextFloat() — возвращает следующее случайное значение типа float
- synchronized double nextGaussian() — возвращает следующее случайное значение гауссова случайного числа, т.е. значения, центрированное по 0.0 со стандартным отклонением в 1.0 (кривая нормального распределения)
- int nextInt(int n) — возвращает следующее случайное значение типа int в диапазоне от 0 до n
- int nextInt() — возвращает следующее случайное значение типа int
- long nextLong() — возвращает следующее случайное значение типа long
- synchronized void setSeeD(long seed) — устанавливает начальное значение
Пример для вывода случайного числа.
final Random random = new Random(); public void onClick(View v)
Случайные числа часто используются в играх. Допустим, мы хотим вывести случайные числа от 1 до 6 при бросании игрального кубика. Попробуем.
mInfoTextView.setText(String.valueOf(random.nextInt(6)));
При проверке вы заметите две нестыковки. Во-первых, иногда выпадает число 0, которого нет на кубике, а во-вторых никогда не выпадает число 6. Когда вы помещаете число в параметр метода, то это означает, что выпадают числа в диапазоне от 0 до указанного числа, которое в этот диапазон не входит. Если вы будете использовать число 7, то шестёрка станет выпадать, но по-прежнему будет выпадать число 0. Поэтому пример следует немного отредактировать.
mInfoTextView.setText(String.valueOf(random.nextInt(6) + 1));
Для генерации 10 чисел типа int используйте код:
String result = ""; for(int i = 0; i < 10; i++)< result += String.valueOf(myRandom.nextInt()) + "\n"; >mInfoTextView.setText(result);
Генерация в определённом интервале
Нужны случайные числа от 100 до 200? Пишем код.
int min = 100; int max = 200; int diff = max - min; Random random = new Random(); int i = random.nextInt(diff + 1); i += min;
Случайные цвета
Работать с числами не слишком интересно. Давайте поработаем со цветом. В Android некоторые цвета имеют конкретные названия, но по сути они являются числами типа int, например, красный цвет имеет константу Color.RED. Вам не надо знать, какое число соответствует этому цвету, так как проще понять по его названию.
public void onClick(View view) < Random random = new Random(); // Массив из пяти цветов int colors[] = < Color.BLUE, Color.GREEN, Color.MAGENTA, Color.RED, Color.CYAN >; int pos = random.nextInt(colors.length); // Меняем цвет у кнопки mButton.setBackgroundColor(colors[pos]); >
Щёлкая по кнопке, вы будете менять её цвет случайным образом.
Лотерея «6 из 49»
Сформируем шесть случайных чисел из 49 и занесём их в списочный массив.
public void onClick(View v) < ArrayListlotteryList = getRandomNumber(); Log.i("Lottery", "" + lotteryList.get(0) + "," + lotteryList.get(1) + "," + lotteryList.get(2) + "," + lotteryList.get(3) + "," + lotteryList.get(4) + "," + lotteryList.get(5)); > private ArrayList getRandomNumber() < ArrayListnumbersGenerated = new ArrayList<>(); for (int i = 0; i < 6; i++) < Random randNumber = new Random(); int iNumber = randNumber.nextInt(48) + 1; if (!numbersGenerated.contains(iNumber)) < numbersGenerated.add(iNumber); >else < i--; >> return numbersGenerated; >
SecureRandom
Стандартный класс Random обычно используют для простых задач, не связанных с шифрованием. Для криптографии следует использовать схожий класс java.security.SecureRandom.
SecureRandom secureRandom = new SecureRandom(); mInfoTextView.setText(String.valueOf(secureRandom.nextInt(6)));
Не забывайте, что в классе Math есть метод random(), возвращающий случайное число от 0 до 1 (единица в диапазон не входит).
В Java 7 появился новый класс java.util.concurrent.ThreadLocalRandom. В Java 8 появился ещё один класс SplittableRandom.
Nextint java что это
Наиболее простой способ взаимодействия с пользователем представляет консоль: мы можем выводить на консоль некоторую информацию или, наоборот, считывать с консоли некоторые данные. Для взаимодействия с консолью в Java применяется класс System , а его функциональность собственно обеспечивает консольный ввод и вывод.
Вывод на консоль
Для создания потока вывода в класс System определен объект out . В этом объекте определен метод println , который позволяет вывести на консоль некоторое значение с последующим переводом курсора консоли на следующую строку. Например:
public class Program < public static void main(String[] args) < System.out.println("Hello world!"); System.out.println("Bye world. "); >>
В метод println передается любое значение, как правило, строка, которое надо вывести на консоль. И в данном случае мы получим следующий вывод:
Hello world! Bye world.
При необходимости можно и не переводить курсор на следующую строку. В этом случае можно использовать метод System.out.print() , который аналогичен println за тем исключением, что не осуществляет перевода на следующую строку.
public class Program < public static void main(String[] args) < System.out.print("Hello world!"); System.out.print("Bye world. "); >>
Консольный вывод данной программы:
Hello world!Bye world.
Но с помощью метода System.out.print также можно осуществить перевод каретки на следующую строку. Для этого надо использовать escape-последовательность \n:
System.out.print("Hello world \n");
Нередко необходимо подставлять в строку какие-нибудь данные. Например, у нас есть два числа, и мы хотим вывести их значения на экран. В этом случае мы можем, например, написать так:
public class Program < public static void main(String[] args) < int x=5; int y=6; System.out.println("x=" + x + "; y console"> x=5; y=6
Но в Java есть также функция для форматированного вывода, унаследованная от языка С: System.out.printf() . С ее помощью мы можем переписать предыдущий пример следующим образом:
int x=5; int y=6; System.out.printf("x=%d; y=%d \n", x, y);
В данном случае символы %d обозначают спецификатор, вместо которого подставляет один из аргументов. Спецификаторов и соответствующих им аргументов может быть множество. В данном случае у нас только два аргумента, поэтому вместо первого %d подставляет значение переменной x, а вместо второго - значение переменной y. Сама буква d означает, что данный спецификатор будет использоваться для вывода целочисленных значений.
Кроме спецификатора %d мы можем использовать еще ряд спецификаторов для других типов данных:
- %x : для вывода шестнадцатеричных чисел
- %f : для вывода чисел с плавающей точкой
- %e : для вывода чисел в экспоненциальной форме, например, 1.3e+01
- %c : для вывода одиночного символа
- %s : для вывода строковых значений
public class Program < public static void main(String[] args) < String name = "Tom"; int age = 30; float height = 1.7f; System.out.printf("Name: %s Age: %d Height: %.2f \n", name, age, height); >>
При выводе чисел с плавающей точкой мы можем указать количество знаков после запятой, для этого используем спецификатор на %.2f , где .2 указывает, что после запятой будет два знака. В итоге мы получим следующий вывод:
Name: Tom Age: 30 Height: 1,70
Ввод с консоли
Для получения ввода с консоли в классе System определен объект in . Однако непосредственно через объект System.in не очень удобно работать, поэтому, как правило, используют класс Scanner , который, в свою очередь использует System.in . Например, напишем маленькую программу, которая осуществляет ввод чисел:
import java.util.Scanner; public class Program < public static void main(String[] args) < Scanner in = new Scanner(System.in); System.out.print("Input a number: "); int num = in.nextInt(); System.out.printf("Your number: %d \n", num); in.close(); >>
Так как класс Scanner находится в пакете java.util , то мы вначале его импортируем с помощью инструкции import java.util.Scanner .
Для создания самого объекта Scanner в его конструктор передается объект System.in . После этого мы можем получать вводимые значения. Например, в данном случае вначале выводим приглашение к вводу и затем получаем вводимое число в переменную num.
Чтобы получить введенное число, используется метод in.nextInt(); , который возвращает введенное с клавиатуры целочисленное значение.
Пример работы программы:
Input a number: 5 Your number: 5
Класс Scanner имеет еще ряд методов, которые позволяют получить введенные пользователем значения:
- next() : считывает введенную строку до первого пробела
- nextLine() : считывает всю введенную строку
- nextInt() : считывает введенное число int
- nextDouble() : считывает введенное число double
- nextBoolean() : считывает значение boolean
- nextByte() : считывает введенное число byte
- nextFloat() : считывает введенное число float
- nextShort() : считывает введенное число short
То есть для ввода значений каждого примитивного типа в классе Scanner определен свой метод.
Например, создадим программу для ввода информации о человеке:
import java.util.Scanner; public class Program < public static void main(String[] args) < Scanner in = new Scanner(System.in); System.out.print("Input name: "); String name = in.nextLine(); System.out.print("Input age: "); int age = in.nextInt(); System.out.print("Input height: "); float height = in.nextFloat(); System.out.printf("Name: %s Age: %d Height: %.2f \n", name, age, height); in.close(); >>
Здесь последовательно вводятся данные типов String, int, float и потом все введенные данные вместе выводятся на консоль. Пример работы программы:
Input name: Tom Input age: 34 Input height: 1,7 Name: Tom Age: 34 Height: 1,70
Обратите внимание, что для ввода значения типа float (то же самое относится к типу double) применяется число "1,7", где разделителем является запятая, а не "1.7", где разделителем является точка. В данном случае все зависит от текущей языковой локализации системы. В моем случае русскоязычная локализация, соответственно вводить необходимо числа, где разделителем является запятая. То же самое касается многих других локализаций, например, немецкой, французской и т.д., где применяется запятая.
Nextint java что это


Скачай курс
в приложении
Перейти в приложение
Открыть мобильную версию сайта
© 2013 — 2023. Stepik
Наши условия использования и конфиденциальности

Public user contributions licensed under cc-wiki license with attribution required
How does input.nextInt() work exactly?
I know nextInt() only read the integer not the "\n" , but why should we need the input.nextLine() to read the "\n" ? is it necessary?? because I think even without input.nextLine() , after it goes back to try <> , the input.nextInt() can still read the next integer I type, but in fact it is a infinite loop. I still don't know the logic behind it, hope someone can help me.
13.8k 9 9 gold badges 55 55 silver badges 77 77 bronze badges
asked Jan 26, 2015 at 16:05
169 1 1 gold badge 1 1 silver badge 9 9 bronze badges
– user3236961
Jan 26, 2015 at 16:09
3 Answers 3
The reason it is necessary here is because of what happens when the input fails.
For example, try removing the input.nextLine() part, run the program again, and when it asks for input, enter abc and press Return
The result will be an infinite loop. Why?
Because nextInt() will try to read the incoming input. It will see that this input is not an integer, and will throw the exception. However, the input is not cleared. It will still be abc in the buffer. So going back to the loop will cause it to try parsing the same abc over and over.
Using nextLine() will clear the buffer, so that the next input you read after an error is going to be the fresh input that's after the bad line you have entered.
