Как-то рассказывал детишкам понятие класс, поля класса, объект, метод в Java, то есть самые базовые понятия в ООП. В качестве примера создавали мы объект крыса (так детишки предложили), а в качестве метода… по предложению моих любимых детишек-студентов крыса должна была укусить случайного студента. И вот тут возник вопрос, а как реализовать метод случайного значения (random)? Вопрос далеко не праздный, как оказывается — не всё так просто. Но обо всём по порядку. Сначала мы создали класс kriska.
public class kriska { }
Потом мы добавили поля класса, такие, как имя крыски, её цвет и вес.
public class kriska { public String name = "Кевин Дэ Хомячков"; public int ves = 100; public String cvet = "Зелёная"; }
Да да вот так зовут нашу животинку — Кевин Дэ Хомячков и весит она у нас 100 кг. Тоже студенты придумали :).
Добавим массив студентов.
public String[] students = {"Вася", "Петя", "Коля"};
Ну что ж, создадим метод ykysi?
public void ykysi(){ System.out.println(cvet + " крыса " + name + " весом " + ves + " кг"+ " укусила Васю. " ); }
Ну и конечно же метод main. Также обратите внимание на то, что метод ykysi не имеет ключевого слова статик, а значит для вызова этого метода нужно будет создать объект.
public class kriska { public String name = "Кевин Дэ Хомячков"; public int ves = 100; public String cvet = "Зелёная"; public String[] students = {"Вася", "Петя", "Коля"}; public void ykysi(){ System.out.println(cvet + " крыса " + name + " весом " + ves + " кг"+ " укусила Васю. " ); } public static void main (String args[]) { kriska kevin = new kriska(); kevin.ykysi(); } }
Особо не устанавливаюсь на ключевых словах и модификатора доступа, поскольку всё это мы проходили в прошлых лекциях. После компиляции появится сообщение, что «Зелёная крыса Кевин Дэ Хомячков весом 100 кг укусила Васю. » Однако же нам требуется, чтобы крыска «кусала» случайного товарища из массива. По идеи выглядеть это должно примерно так:
System.out.println(cvet + " крыса " + name + " весом " + ves + " кг"+ " укусила " + students[тут случайное число от 0 до 2] );
Для генерации случайного числа в java есть метод Math.random();, вот только генерирует он числа от 0 до 1!
То есть имеет тип double.
Изменим код следующим образом
import com.sun.org.apache.xerces.internal.impl.xpath.regex.Match; import java.util.Random; public class kriska { public String name = "Кевин Дэ Хомячков"; public int ves = 100; public String cvet = "Зелёная"; public String[] students = {"Вася", "Петя", "Коля"}; public void ykysi(){ //System.out.println(cvet + " крыса " + name + " весом " + ves + " кг"+ " укусила Васю. " ); System.out.println (Math.random()); } public static void main (String args[]) { kriska kevin = new kriska(); kevin.ykysi(); } }
При компиляции получим что-то вроде: 0.37700575587216867
Ага, подумали мы, что же делать? Метод уже готовый есть, но он нам не очень подходит.
Надо бы его доработать чуть-чуть напильником.
Давайте создадим дополнительное поле класса kriska, в котором будет максимальное число диапазона генерации числа.
Оно должно быть равно числу элементов массива. Однако считаем мы элементы массива с 0, поэтому значения такого поля у нас будет 2.
Модификатор доступа поставлю private — Не думаю, что какому-то ещё классу понадобится это поле.
private int max = 2;
Поскольку значения нам нужны целочисленные, то значение метода Math.random() нужно преобразовать из double в int — из числа
с двойной точностью в число с одинарной. Но вот нюанс — округление происходит очень просто — отбрасывается всё, что после нуля.
Поэтому если мы пропишем
System.out.println ((int) Math.random());
, то всегда получим 0! Вот тут-то нам и понадобится переменная с максимальным числом (в нашем случае число 2), НО!
поскольку при приведении типов просто отсекаются данные после 0, то к нашему максимальному числу нужно прибавить единицу, умножить на
случайное сгенерированное значение метода Math.random() и при приведении к int мы получим случайное число от 0 до нашей переменной max.
Давайте создадим статичный метод (дабы лишний раз не создавать объекты и иметь возможность использовать метод внутри метода), где
и реализуем эту логику.
public static int rand(int max) { return (int) (Math.random() * ++max); }
Метод rand типа int получает значение переменной max типа int и возвращается случайное число, сгенерированное методом
Math.random(), умноженное на переменную max, к которйо перед этим прибавили единичку. Ну а привидение типа к int отсекает из полученного числа всё, что после 0. В конечно счёте код выглядит так:
import com.sun.org.apache.xerces.internal.impl.xpath.regex.Match; import java.util.Random; public class kriska { public String name = "Кевин Дэ Хомячков"; public int ves = 100; public String cvet = "Зелёная"; public String[] students = {"Васю", "Петю", "Колю"}; private int max = 2; public static int rand(int max) { return (int) (Math.random() * ++max); } public void ykysi(){ System.out.println(cvet + " крыса " + name + " весом " + ves + " кг"+ " укусила " + students[rand(max)] ); } public static void main (String args[]) { kriska kevin = new kriska(); kevin.ykysi(); } }
Вот и всё, теперь зелёная стокилограммовая крыска весом 100 кг кусается случайным образом 🙂
Просто? Конечно просто. А ведь примерно также работают в Интернете многочисленные виртуальные «шары предсказаний», которые пытаются односложно ответить на заданный вопрос, ну или там тесты типа, каким ты был предводителем? так популярные в фэйсбуке. Разве что данные таскают из базы данных. Простейший щар предсказаний выглядел бы так:
public class shar { private int max = 5; public String[] shar = {"Нет", "Да", "Мои источники говорят НЕТ", "Мои источники говорят ДА", "Пока не знаю", "Попробуй спросить позже"}; public static int rand(int max) { return (int) (Math.random() * ++max); } public void predskazanie(){ System.out.println("На Ваш вопрос Шар предсказаний отвечает: " + shar[rand(max)]); } public static void main (String args[]){ shar sharik = new shar(); sharik.predskazanie(); } }
А вот код программки с графическим окном. Не всё ж сидеть в консоли. Объясню его позже.
public class testgui { public static JButton b1; public static JLabel jl1; public static int max = 5; public static String[] shar = {"Нет", "Да", "Мои источники говорят НЕТ", "Мои источники говорят ДА", "Пока не знаю", "Попробуй спросить позже"}; public static int rand(int max) { return (int) (Math.random() * ++max); } public static void main(String[] args) { JFrame window = new JFrame ("Шар предсказаний"); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setSize(450, 100); window.setVisible(true); window.setResizable(false); JPanel fon = new JPanel(); window.add(fon); fon.setLayout(new BorderLayout()); b1 = new JButton("Получить предсказание."); fon.add(b1, BorderLayout.SOUTH); ActionListener actionListener = new TestActionListener(); b1.addActionListener(actionListener); jl1 = new JLabel(); fon.add(jl1, BorderLayout.NORTH); } public static class TestActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { if(e.getSource()==b1){ jl1.setText("На Ваш вопрос Шар предсказаний отвечает: " + "\n" + shar[rand(max)]); } } } }