Top.Mail.Ru

Перечень уроков по Java

8. Генерация случайных чисел в заданном диапазоне

Существует несколько способов генерации случайного (псевдослучайного) числа:

  1. Использование метода random() из класса математических функций Math, находящемся в пакете java.lang.
  1. Использование метода random() из класса Random, находящемся в пакете java.util.Random.
  1. Использование генератора случайных чисел класса SecureRandom, предназначенного для целей криптографии и, находящегося в пакете java.security.SecureRandom (здесь не рассматривается).

 Рассмотрим методы генерации случайных чисел.

 

  1. Класс Math. Метод random()

Метод random() класса Math возвращает псевдослучайное число типа double в диапазоне  0 ≤ Math.random() < 1.

Пример 1. Несколько случайных чисел

public static void main(String[] args) {

  System.out.println("Cлучайное число № 1: " + Math.random());

    System.out.println("Случайное число № 2: " + Math.random());

    System.out.println("Случайное число № 3: " + Math.random());

    }

 Результат.

Случайное число № 1: 0.9161994380531232
Случайное число № 2: 0.24340742865928744
Случайное число № 3: 0.9783627451986034

 

Пример 2. Случайное число  x в диапазоне a  ≤  x ≤ b

Для генерации целого случайного числа x в заданном диапазоне  a  ≤  x ≤  b, обычно используется следующая зависимость:

x =  a + (int)(Math.random()*((b - a) + 1)).

Получим случайное число x в диапазоне: 10 ≤  x ≤  20 (a=10, b=20).

 

 int a=10;

int b=20;

int x= a + (int)(Math.random() * ((b - a) + 1));

System.out.println("Случайное число x: " + x);

 Результат.
Случайное число x: 19

  

  1. Класс Random. Метод random()

Это наиболее часто используемый класс для генерации псевдослучайный чисел с равномерной функцией распределения. Имеется метод nextGaussian(), который моделирует функцию нормального распределения.

Основными методами этого класса являются:

  • int nextInt() -  возвращает следующее случайное значение ix типа  int в диапазоне  -2147483648 ≤ ix < 2147483647
  • int nextInt(int n)  -  возвращает следующее случайное значение ix типа int в диапазоне  0 ≤ ix < n
  • float nextFloat()  -  возвращает следующее случайное значение fx типа float в диапазоне 0.0 ≤ fx < 1.0
  • double nextDouble()  -  возвращает следующее случайное значение dx типа double в диапазоне 0.0 ≤ dx < 1.0
  • boolean nextBoolean()  -  возвращает следующее случайное значение типа boolean
 Для получения случайных чисел необходимо:
  1.  Подключить библиотеку случайных чисел. Пишем до определения класса. 
    import java.util.Random;
  2.  В классе создать объект rand случайных чисел
     Random rand = new Random();
  3.  Далее использовать необходимые методы объекта rand.

Пример 1. Несколько случайных чисел разных типов.

public static void main(String[] args) {

    Random rand = new Random();

    int ix =    rand.nextInt();

    double dx = rand. nextDouble();

    float fx = rand.nextFloat();

    boolean bx = rand.nextBoolean();

    System.out.println("Случайное число ix: " + ix);

    System.out.println("Случайное число dx: " + dx);

    System.out.println("Случайное число fx: " + fx);

    System.out.println("Случайное число bx: " + bx);

Результат.

Случайное число ix: 1438841988   Случайное число dx: 0.6120986135409442 Случайное число fx: 0.103119016 Случайное число bx: true

 

Пример 2. Случайное число x в диапазоне a ≤ x ≤ b.

Для генерации целого случайного числа x в заданном диапазоне  a  ≤  x ≤  b, обычно используется следующая зависимость:

  тип int       int  x  =  a + rand.nextInt(b - a + 1).

  тип double    double  y  =  a + rand.nextInt(b - a).

    Random rand = new Random();

    int a=10;

    int b=20;

    int x  =  a +  rand.nextInt(b - a + 1);

    double dx  = a +  rand.nextDouble()*(b - a);

    System.out.println("Случайное число x: " + x);

    System.out.println("Случайное число dx: " + dx);

Результат.

Случайное число x: 12 Случайное число dx: 17.505847041626733

 Для типа double  будет выведено случайное число в  виде:

                dx: 17.505847041626733,

 что неудобно. Для приемлемого представления используется форматный вывод, позволяющий выводить числа с заданной точностью.

  

Форматный вывод

 Пакет java.io содержит класс PrintStream, который содержит методы printf и format, позволяющие выводить числа с заданной точностью. Рассмотрим метод format(). Синтаксис метода

 System.out.format(String format, Object... args),

 где:

format — это строка - шаблон, согласно которому будет происходить форматирование,  args — это список переменных, для вывода по заданному шаблону.

Строка - шаблон содержит обычный текст и специальные форматирующие символы. Эти символы начинаются со знака процента (%) и заканчиваются конвертором — символом, который определяет тип переменной для форматирования.  Вот некоторые конверторы:

d

Десятичное целое

f

Float

n

переход на новую строку

.2

число после точки – количество символов после запятой

5.

число до точки – количество символов до запятой

 

Пример.

double dx= 4.56789;

 System.out.format("%f%n", dx);  // будет выведено 4.56789;

 //два знака после запятой

System.out.format("%.2f%n", dx); // будет выведено 4.56;