Заведём джаву. Внеурочная заметка №3. Функция RANDOM (случайное число) в Java

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

}

Поделиться ссылкой:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *