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

 


Споріднені теми