Java 랜덤 클래스

소개

자바의 Random 클래스는 의사 난수를 생성하는 데 사용됩니다. 이 글에서는 자바 Random 클래스와 해당 메서드, 그리고 자바 프로그래밍 언어에서 제공하는 생성자에 대해 알아보겠습니다.

자바의 Random 클래스란?

Random 클래스는 java.util 패키지의 일부입니다. Java Random 클래스의 인스턴스는 난수를 생성하는 데 사용됩니다. 이 클래스는 int, double, long, float 등 다양한 유형의 난수를 생성하기 위한 여러 메서드를 제공합니다. 난수 생성 알고리즘은 시드 값을 기반으로 작동합니다. 시드 값이 제공되지 않으면 시스템 나노 시간에서 시드 값이 생성됩니다. 두 개의 랜덤 인스턴스가 동일한 시드 값을 가지면 동일한 난수 시퀀스를 생성합니다.

자바 Random 클래스는 스레드로부터 안전합니다. 그러나 멀티스레드 환경에서는 java.util.concurrent.ThreadLocalRandom 클래스를 사용하는 것이 좋습니다. Random 클래스 인스턴스는 보안에 민감한 응용 프로그램에 적합하지 않으며 이러한 경우에는 java.security.SecureRandom을 사용하는 것이 좋습니다.

Random 클래스 선언

public class Random
    extends Object
    implements Serializable

기본 랜덤 숫자 생성기

때로는 일련의 숫자를 생성해야 할 때가 있습니다. 숫자 시퀀스를 생성하는 것은 문제가 아닙니다. 그러나 때로는 난수를 생성해야 할 때가 있습니다. 자바에서는 Random 클래스를 사용하여 난수를 생성할 수 있습니다. Random 클래스를 사용하면 무작위 정수, 롱 숫자, 더블 값 등을 생성할 수 있습니다.

난수를 생성하는 완전한 프로그램은 다음과 같습니다.

import java.util.Random;

public class RandomNumberGenerator {
    public static void main(String a[]){
        Random rand = new Random();
        System.out.println("랜덤 정수:");
        System.out.println(rand.nextInt());
        System.out.println(rand.nextInt());
        System.out.println(rand.nextInt());
        System.out.println("랜덤 더블 숫자:");
        System.out.println(rand.nextDouble());
        System.out.println(rand.nextDouble());
        System.out.println(rand.nextDouble());
        System.out.println("랜덤 롱 숫자:");
        System.out.println(rand.nextLong());
        System.out.println(rand.nextLong());
        System.out.println(rand.nextLong());
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

랜덤 정수:
1286597545
285209628
-197572901
랜덤 더블 숫자:
0.868534165767405
0.6147617704099448
0.19394293298399123
랜덤 롱 숫자:
3948488349075667224
4138509363679482099
7338513431375510467

Random 클래스의 생성자

Random()

새로운 랜덤 숫자 생성기를 만듭니다. 시드는 현재 시간을 기반으로 초기화됩니다.

public Random()
{
    this(System.currentTimeMillis());
}

Random 클래스를 사용한 Random() 생성자의 전체 프로그램은 다음과 같습니다.

import java.util.Random;

public class RandomClassExample1 {
    public static void main(String[] args) {
        Random random = new Random();
        System.out.println(random.nextBoolean());
        System.out.println(random.nextDouble());
        System.out.println(random.nextFloat());
        System.out.println(random.nextInt());
        System.out.println(random.nextInt(20));
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

false
0.6249304829049422
0.7747113
1806354847
19

Random(long seed)

지정된 시드를 사용하여 새로운 난수 생성기를 만듭니다.

public Random(long seed)
{
    setSeed(seed);
}

Random 클래스를 사용한 Random(long seed) 생성자의 전체 프로그램은 다음과 같습니다.

import java.util.Random;

public class RandomClassExample2 {
    public static void main(String[] args) {
        Random random = new Random(100);
        System.out.println("Random(long seed)를 사용합니다.");
        System.out.println(random.nextInt());
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

Random(long seed)를 사용합니다.
-1193959466

Random 클래스의 메서드

1) java.util.Random.next() 메서드

next(int bits) 메서드는 의사 난수를 생성하는 데 사용됩니다. java.util.Random.next() 메서드는 비트 매개 변수를 사용하며, 이는 무작위 비트입니다. 메서드 호출은 이 난수 생성기 시퀀스에서 의사 난수 값을 반환합니다.

java.util.Random.next() 메서드의 전체 프로그램은 다음과 같습니다.

import java.util.Random;

public class RandomClassExample3 {
    public static void main(String args[]) {
        // 랜덤 객체 생성
        Random randomno = new Random();
        // 의사 난수 값을 가져옵니다.
        int value = randomno.nextInt();
        // 값 확인
        System.out.println("값은: " + value);
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

값은: -488018115

2) java.util.Random.nextBoolean() 메서드

nextBoolean() 메서드는 이 랜덤 숫자 생성기 시퀀스에서 의사 난수로 균일하게 분포된 부울 값을 가져옵니다. java.util.Random.nextBoolean() 메서드는 부울 값을 반환합니다.

java.util.Random.next() 메서드의 전체 프로그램은 다음과 같습니다.

import java.util.Random;

public class RandomClassExample4 {
    public static void main( String args[] ) {
        // 랜덤 객체 생성
        Random randomno = new Random();
        // 부울 값을 가져옵니다.
        boolean value = randomno.nextBoolean();
        System.out.println("값은: " + value);
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

값은: true

3) java.util.Random.nextBytes(byte[] bytes) 메서드

nextBytes(byte[] bytes) 메서드는 무작위 바이트를 생성하고 사용자 제공 바이트 배열에 넣는 데 사용됩니다. java.util.Random.nextBytes(byte[] bytes) 메서드는 bytes를 매개 변수로 사용하며, 이는 무작위 바이트를 넣을 비어있지 않은 바이트 배열입니다.

java.util.Random.nextBytes() 메서드의 전체 프로그램은 다음과 같습니다.

import java.util.Random;

public class RandomClassExample5 {
    public static void main( String args[] ) {
        // 랜덤 객체 생성
        Random randomno = new Random();
        // 바이트 배열 생성
        byte[] nbyte = new byte[30];
        // 바이트를 배열에 넣습니다.
        randomno.nextBytes(nbyte);
        // 배열의 값을 확인합니다.
        System.out.println("바이트 배열 값: " + nbyte);
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

바이트 배열 값: [B@58ceff1

4) java.util.Random.nextDouble() 메서드

nextDouble() 메서드는 이 랜덤 숫자 생성기 시퀀스에서 0.0부터 1.0까지 균일하게 분포된 더블 값을 가져옵니다.

java.util.Random.nextDouble() 메서드의 전체 프로그램은 다음과 같습니다.

import java.util.Random;

public class RandomClassExample6 {
    public static void main( String args[] ) {
        // 랜덤 객체 생성
        Random randomno = new Random();
        // 더블 값을 확인합니다.
        System.out.println("더블 값: " + randomno.nextDouble());
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

더블 값: 0.5121321379067455

5) java.util.Random.nextFloat() 메서드

nextFloat() 메서드는 이 랜덤 숫자 생성기 시퀀스에서 0.0부터 1.0까지 균일하게 분포된 플로트 값을 가져옵니다.

java.util.Random.nextFloat() 메서드의 전체 프로그램은 다음과 같습니다.

import java.util.Random;

public class RandomClassExample7 {
    public static void main( String args[] ) {
        // 랜덤 객체 생성
        Random randomno = new Random();
        // 플로트 값을 확인합니다.
        System.out.println("플로트 값: " + randomno.nextFloat());
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

플로트 값: 0.799144

6) java.util.Random.nextGaussian() 메서드

nextGaussian() 메서드는 이 랜덤 숫자 생성기 시퀀스에서 평균 0.0 및 표준 편차 1.0으로부터 균일하게 분포된 더블 값을 가져옵니다.

java.util.Random.nextGaussian() 메서드의 전체 프로그램은 다음과 같습니다.

import java.util.Random;

public class RandomClassExample8 {
    public static void main( String args[] ) {
        // 랜덤 객체 생성
        Random randomno = new Random();
        // 가우시안 값을 확인합니다.
        System.out.println("가우시안 값: " + randomno.nextGaussian());
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

가우시안 값: -0.772673554183464

7) java.util.Random.nextInt() 메서드

nextInt() 메서드는 이 랜덤 숫자 생성기 시퀀스에서 균일하게 분포된 정수 값을 가져옵니다.

java.util.Random.nextInt() 메서드의 전체 프로그램은 다음과 같습니다.

import java.util.Random;

public class RandomClassExample9 {
    public static main(String args[]) {
        // 랜덤 객체 생성
        Random randomno = new Random();
        // 정수 값을 확인합니다.
        System.out.println("정수 값: " + randomno.nextInt());
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

정수 값: 2043638838

8) java.util.Random.nextInt(int n) 메서드

nextInt(int n) 메서드는 0(포함)부터 지정된 값(제외)까지 균일하게 분포된 정수 값을 가져옵니다. java.util.Random.nextInt(int n)은 매개 변수로 n을 사용합니다. 이는 반환될 무작위 숫자의 바운드입니다. 반드시 양수여야 합니다.

예외: n이 양수가 아닌 경우 IllegalArgumentException을 발생시킵니다.

java.util.Random.nextInt(int n) 메서드의 전체 프로그램은 다음과 같습니다.

import java.util.Random;

public class RandomClassExample10 {
    public static void main( String args[] ) {
        // 랜덤 객체 생성
        Random randomno = new Random();
        // 정수 값을 확인합니다.
        System.out.println("정수 값: " + randomno.nextInt(10000));
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

정수 값: 5063

9) java.util.Random.nextLong() 메서드

nextLong() 메서드는 이 랜덤 숫자 생성기 시퀀스에서 균일하게 분포된 롱 값을 반환합니다.

java.util.Random.nextLong() 메서드의 전체 프로그램은 다음과 같습니다.

import java.util.Random;

public class RandomClassExample11 {
    public static void main( String args[] ) {
        // 랜덤 객체 생성
        Random randomno = new Random();
        // 롱 값을 가져옵니다.
        long value = randomno.nextLong();
        //값 확인
        System.out.println("롱 값: " + value);
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

롱 값: -5171429371330346374

10) java.util.Random.setSeed(long seed) 메서드

setSeed(long seed) 메서드는 이 랜덤 숫자 생성기의 시드를 설정하는 데 사용됩니다. java.util.Random.setSeed(long seed) 메서드는 초기 시드로 사용할 매개 변수로 단일 롱 시드를 사용합니다.

java.util.Random.setSeed(long seed) 메서드를 사용한 전체 프로그램은 다음과 같습니다.

import java.util.Random;

public class RandomClassExample12 {
    public static void main( String args[] ) {
        // 랜덤 객체 생성
        Random randomno = new Random();
        // 시드 설정
        randomno.setSeed(20);
        // 시드 설정 후의 값
        System.out.println("시드 설정 후 객체: " + randomno.nextInt());
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

시드 설정 후 객체: -1150867590

랜덤 숫자 생성기의 시드란 무엇인가요?

시드는 의사 난수 생성기의 내부 상태의 초기값으로, next(int) 메서드로 유지됩니다. 단일 롱 시드를 사용하여 새로운 랜덤 숫자 생성기를 만듭니다.

new Random(seed)를 호출하는 것은 다음과 같습니다.

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

Random 클래스의 시드 값을 어떻게 변경하나요?

가끔은 시퀀스 생성 메서드를 호출할 때마다 항상 동일한 무작위 숫자 시퀀스를 생성해야 할 때가 있습니다. 단순한 Random() 클래스 생성자를 사용하면 이것을 달성할 수 없습니다. 동일한 시드를 전달하면 매번 동일한 무작위 시퀀스를 얻을 수 있도록 Random() 생성자에 시드를 전달해야 합니다.

다음은 Random 클래스에서 시드 값을 변경하는 과정을 보여주는 전체 프로그램입니다.

import java.util.Random;

public class RandomClassExample13 {
    public static void main(String a[]) {
        Random rnd = new Random(40);
        for (int i = 0; i < 3; i++) {
            System.out.println(rnd.nextInt(100));
        }
        System.out.println("시퀀스 변경을 위한 시드 변경");
        rnd.setSeed(45);
        for (int i = 0; i < 3; i++) {
            System.out.println(rnd.nextInt(100));
        }
        System.out.println("시퀀스 변경을 위한 시드 변경");
        rnd.setSeed(50);
        for (int i = 0; i < 3; i++) {
            System.out.println(rnd.nextInt(100));
        }
        System.out.println("이전 시퀀스를 생성하기 위한 시드 40 설정");
        rnd.setSeed(40);
        for (int i = 0; i < 3; i++) {
            System.out.println(rnd.nextInt(100));
        }
    }
}

위 프로그램은 다음과 같은 결과를 생성합니다.

82
39
37
시퀀스 변경을 위한 시드 변경
9
31
31
시퀀스 변경을 위한 시드 변경
17
88
93
이전 시퀀스를 생성하기 위한 시드 40 설정
82
39
37

요약

이 글에서는 자바의 Random 클래스, 해당 메서드, 그리고 자바 프로그램에서 Random 클래스를 어떻게 사용하는지에 대해 알아보았습니다. 랜덤 클래스를 활용하여 다양한 유형의 난수를 생성하고, 시드를 설정하여 원하는 시퀀스를 얻을 수 있음을 배웠습니다.

Leave a Comment