Как-то рассказывал детишкам понятие класс, поля класса, объект, метод в 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)]);
}
}
}
}