Архив метки: класс

Java. Класс Random. Генерирование случайных чисел

Класс Random. Генерирование случайных чисел. Конструкторы класса. Список методов. Методы получения одиночных случайных чисел


Содержание


Поиск на других ресурсах:

1. Класс Random. Общие сведения. Конструкторы класса

Класс Random используется для создания случайных чисел. Для использования возможностей (методов) класса Random в начале приложения нужно подключить модуль java.util.Random следующим образом

import java.util.Random;

Конструкторы класса создают новый генератор случайных чисел. Для создания генератора используются следующие основные конструкторы

Random()
Random(int seed)

здесь

  • seed – начальное число, в отношении которого генерируется последовательность случайных чисел. Это число поддерживается методом next(), генерирующим псевдослучайное число (pseudorandom number).

Создание экземпляров класса Random, которые будут генерировать последовательности случайных чисел с помощью вышеперечисленных конструкторов может быть примерно таким

Random rnd1 = new Random(122);
Random rnd2 = new Random();

здесь

  • r1, r2 – экземпляры, которые будут генерировать последовательности случайных чисел;
  • 122 – целое число, с которого начинается формирование следующих случайных чисел. Здесь можно задавать любое другое целое число (55, 101… и т.п.).

После создания экземпляра класса Random становятся доступны непосредственно методы, позволяющие получать последовательности случайных чисел.

 

2. Базовые методы класса Random. Список

Класс Random содержит ряд методов для генерирования случайных чисел:

  • setSeed() – устанавливает исходное значение, которое используется в качестве основы для генерирования случайных чисел;
  • doubles() – формирует данные типа double в виде потока случайных чисел;
  • ints() – формирует данные типа int в виде потока случайных чисел;
  • longs() – формирует поток данных типа long, содержащий случайные числа;
  • nextBoolean() – возвращает случайное значение типа boolean;
  • nextBytes() – возвращает массив случайных чисел типа byte[];
  • nextDouble() – возвращает случайное число типа double;
  • nextFloat() – возвращает случайное число типа float;
  • nextGaussian() – возвращает псевдослучайное значение на основе распределения Гаусса;
  • nextInt() – возвращает случайное число типа int;
  • nextLong() – возвращает случайное число типа long.

 

3. Метод setSeed(int). Установить начальное значение

Метод setSeed() позволяет задавать исходное значение, на основе которого формируется последовательность случайных чисел. В последовательности каждое последующее число зависит от предыдущего. Согласно документации сигнатура метода setSeed() следующая

void setSeed(long seed);

здесь

  • seed – начальное значение, на основе которого генерируется последовательность случайных чисел.

Создание экземпляра класса Random с помощью конструктора с параметром

Random rnd = new Random(seed);

эквивалентна строкам

Random rnd = new Random();
rnd.setSeed(seed);

здесь

  • seed – некоторое целочисленное значение типа long.

 

Пример.

В примере создается поток данных, содержащих 10 случайных чисел типа double. Сначала начальное значение (seed) задается равным 122, затем оно переопределяется новым значением 150 с помощью метода setSeed().

import java.util.Iterator; // нужно для использования класса Iterator<>
import java.util.Random;   // нужно для использования класса Random
import java.util.stream.DoubleStream; // нужно для использования класса DoubleStream

public class MathFunctions {

  public static void main(String[] args) {

    // 1. Создать поток на основе ядра 122
    Random r1 = new Random(122); //

    // 2. Установить новое ядро - вызов метода setSeed()
    r1.setSeed(150);

    // 3. Получить поток из 10 чисел типа double
    DoubleStream ds1 = r1.doubles(10);

    // 4. Получить итератор на поток ds1
    Iterator<Double> it1 = ds1.iterator();

    // 5. Вывести в цикле 10 случайных чисел из потока ds1
    System.out.println("Stream ds1:");

    while (it1.hasNext()) {
      System.out.println(it1.next());
    }
  }
}

Результат

Stream ds1:
0.7436883394251182
0.16523214952520537
0.6551835693241186
0.46667154390807386
0.02763677886761373
0.7815907963879736
0.23597049719139052
0.3714539686578885
0.22142228403292508
0.5329685061913043

 

4. Метод nextBoolean(). Получить случайное значение типа boolean

Метод nextBoolean() позволяет получить случайное значение типа boolean. Согласно документации объявления метода в классе Random следующее

public boolean nextBoolean();

 

Пример.

import java.util.Random;

public class MathFunctions {

  public static void main(String[] args) {
    // 1. Создать поток на основе произвольного исходного значения
    Random r1 = new Random();

    // 2. Получить случайное значение типа boolean
    boolean b1 = r1.nextBoolean();

    System.out.println("b1 = " + b1);
  }
}

Результат

b1 = true

 

5. Метод nextDouble(). Получить случайное число типа double. Формирование чисел в заданных пределах

Метод nextDouble() возвращает случайное число типа double. Значение числа лежит в пределах [0.0; 1.0[ – значение 0.0 включительно, значение 1.0 исключительно. Согласно документации объявление метода следующее

public double nextDouble();

 

Пример.

В примере сначала формируется массив из 10 чисел типа double. Затем этот массив выводится на экран. Значение каждого числа типа double лежит в пределах [min; max) где min и max вводятся с клавиатуры.

import java.util.Random;   // нужно для использования класса Random
import java.util.Scanner;   // нужно для использования класса Scanner

public class MathFunctions {

  public static void main(String[] args) {
    // 1. Создать поток на основе произвольного исходного значения
    Random rnd = new Random();

    // 2. Создать массив из 10 элементов типа double
    double[] AD = new double[10];

    // 3. Задать с клавиатуры нижнюю и верхнюю границу случайных чисел
    double min, max;
    Scanner input = new Scanner(System.in);

    // 3.1. Ввести нижнюю границу
    System.out.print("min = ");
    min = input.nextDouble();

    // 3.2. Ввести верхнюю границу
    System.out.print("max = ");
    max = input.nextDouble();

    // 4. Заполнить массив AD случайными числами в пределах [min; max]
    double value;

    for (int i=0; i<AD.length; i++) {
      // Получить случайное число в пределах [0.0; 1.0)
      value = rnd.nextDouble();

      // Откорректировать пределы числа value как [min; max]
      AD[i] = min + value * (max - min);
    }

    // 5. Вывести массив AD
    System.out.println("\nAD:");

    for (int i=0; i<10; i++)
      System.out.println(AD[i]);
  }
}

Результат

min = 2.5
max = 3.8

AD:
2.8359371330191094
2.758080086113864
3.573990757948374
3.3258831628588483
3.4857770403575628
3.659913452046651
3.218060124836948
3.032705795552893
3.7447915830146092
2.791155939366058

 

6. Метод nextFloat(). Получить случайное число типа float

Метод nextFloat() возвращает случайное число типа float. Сигнатура метода следующая

float nextFloat();

Метод возвращает число, которое находится в диапазоне [0.0f; 1.0f).

Пример.

В примере формируется массив из 10 случайных чисел типа float. Числа лежат в диапазоне [-5; 5).

import java.util.Random;   // нужно для использования класса Random
import java.util.Scanner;   // нужно для использования класса Scanner

public class MathFunctions {

  public static void main(String[] args) {
    // 1. Создать поток на основе произвольного исходного значения
    Random rnd = new Random();

    // 2. Создать массив из 10 элементов типа float
    float[] AF = new float[10];

    // 3. Задать с клавиатуры нижний и верхний предел случайных чисел
    float min, max;
    Scanner input = new Scanner(System.in);

    // 3.1. Ввести нижнюю границу
    System.out.print("min = ");
    min = input.nextFloat();

    // 3.2. Ввести верхнюю границу
    System.out.print("max = ");
    max = input.nextFloat();

    // 4. Заполнить массив AF случайными числами в пределах [min; max]
    float value;

    for (int i=0; i<AF.length; i++) {
      // Получить случайное число в пределах [0.0; 1.0)
      value = rnd.nextFloat();

      // Откорректировать пределы числа value как [min; max]
      AF[i] = min + value * (max - min);
    }

    // 5. Вывести массив AF
    System.out.println("\nAF:");

    for (int i=0; i<10; i++)
      System.out.println(AF[i]);
  }
}

Результат

min = -5
max = 5

AF:
-0.4368925
-4.857518
-1.9285429
-1.3483305
-1.2607784
3.6692915
3.8821516
4.8362236
3.9554806
0.30514526

 

7. Метод nextGaussian(). Получить псевдослучайное значение на основе распределения Гаусса

Метод nextGaussian() возвращает значение типа double, полученное на основе распределения Гаусса со средним значением 0.0 и стандартным отклонением 1.0. Согласно документации объявления метода в классе Random следующее

public double nextGaussian();

 

Пример.

import java.util.Random;

public class MathFunctions {

  public static void main(String[] args) {
    // 1. Создать поток на основе произвольного исходного значения
    Random rnd = new Random();

    // 2. Создать массив AD из 10 элементов типа double
    //   в котором элементы получаются на основе распределения Гаусса
    double[] AD = new double[10];

    // 3. Заполнить массив AD случайными числами
    //    с использованием метода nextGaussian()
    for (int i=0; i<AD.length; i++)
      AD[i] = rnd.nextGaussian();

    // 4. Вывести массив AD на экран
    System.out.println("Array AD:");

    for (int i=0; i<AD.length; i++)
      System.out.println(AD[i]+" ");
  }
}

Результат

Array AD:
0.8462285437123548
1.1084379848996055
0.5552376880883958
-1.0787586788543444
0.9944069427425211
0.8645907102307332
-1.449023177851094
1.2567221522577043
-1.073685704004384
-0.8709705603926711

 

8. Метод nextInt(). Получить случайное число типа int. Получить целое число в заданных пределах

Метод nextInt() возвращает целое случайное число типа int. Число может быть как положительным, так и отрицательным. Согласно документации объявление метода следующее

public int nextInt();

 

Пример.

В примере с помощью метода nextInt() формируется массив случайных чисел. Каждое число имеет значение в пределах [min; max]. Для формирования числа выведена формула. В конце массив сформированных чисел выводится на экран. Для ввода цифр с клавиатуры используются средства класса Scanner.

import java.util.Random;   // нужно для использования класса Random
import java.util.Scanner;   // нужно для использования класса Scanner

public class MathFunctions {

  public static void main(String[] args) {
    // 1. Создать поток на основе произвольного исходного значения
    Random rnd = new Random();

    // 2. Создать массив из 10 элементов типа int
    int[] AI = new int[10];

    // 3. Задать с клавиатуры нижний и верхний предел случайных чисел
    int min, max;
    Scanner input = new Scanner(System.in);

    // 3.1. Ввести нижнюю границу
    System.out.print("min = ");
    min = input.nextInt();

    // 3.2. Ввести верхнюю границу
    System.out.print("max = ");
    max = input.nextInt();

    // 4. Заполнить массив AI случайными числами в пределах [min; max]
    for (int i=0; i<AI.length; i++)
      AI[i] = min + Math.abs(rnd.nextInt()) % (max - min + 1);

    // 5. Вывести массив
    System.out.println("\nAI:");

    for (int i=0; i<10; i++)
      System.out.println(AI[i]);
  }
}

Результат

min = 1
max = 10

AI:
7
10
5
5
8
2
1
4
9
5

 

9. Метод nextLong(). Получить случайное число типа long

Метод nextLong() возвращает случайное число типа long. Согласно документации Java объявление метода выглядит следующим образом

public long nextLong();

 

Пример.

import java.util.Random;

public class MathFunctions {

  public static void main(String[] args) {
    // 1. Создать поток на основе произвольного исходного значения
    Random rnd = new Random();

    // 2. Создать массив AL из 10 элементов типа long
    long[] AL = new long[10];

    // 3. Заполнить массив AL случайными числами
    //    с использованием метода nextLong()
    for (int i=0; i<AL.length; i++)
      AL[i] = rnd.nextLong();

    // 4. Вывести массив AL на экран
    System.out.println("Array AL:");

    for (int i=0; i<AL.length; i++)
      System.out.println(AL[i]+" ");
  }
}

Результат

Array AL:
7366919727266127728
-979699283376638676
5249017576319962809
-4343155317134154076
6027817083452027820
-2862223376222694775
1510496055653313188
5133621007379261861
5000401929540016138
5865861847345821978

 


Связанные темы