[Java ☕️] Random Class

ConewLog·2024년 8월 9일
0

Java ☕️

목록 보기
6/7

☕️ 김영한의 실전 자바 - 중급 1편 을 수강하며 학습한 내용을 저만의 언어로 정리하고 있습니다.


1. java.util.Random

java.util 패키지는 컬렉션 프레임워크, 날짜와 시간 관련 기능 등 유용한 클래스들이 포함되어 있는 패키지이다.

그 중 Random 클래스는 난수 생성 기능을 제공하는 클래스이다.

  • 정확히 얘기하면, 유사 난수를 생성하는 클래스이다.
    (An instance of this class is used to generate a stream of pseudorandom numbers. - java documentation)
  • 유사 난수란, 난수를 흉내내기 위해 알고리즘으로 생성되는 값을 의미한다.
  • 일단은 랜덤값을 생성하기 위한 클래스라고 이해하면 된다.

2. Random class 사용 예시

import java.util.Random;

public class RandomExample {
    public static void main(String[] args) {
        Random random = new Random();

        int randomInt = random.nextInt();
        double randomDouble = random.nextDouble();
        boolean randomBoolean = random.nextBoolean();
        System.out.println("randomInt = " + randomInt);

        // 1에서 5 사이의 random한 정수형 얻기
        int randomInt1_5 = random.nextInt(5) + 1;
        System.out.println("randomInt1_5 = " + randomInt1_5);
    }
}
  • Random 인스턴스를 생성한다.

  • .nextInt() 메서드로 int형 난수를 반환한다.

    • nextLong(), nextFloat(), nextBoolean(), nextDouble() 등 가능
  • .nextInt(int bound) 메서드는 0 이상 bound 미만의 int형 난수를 반환한다.

    • 따라서, 1 이상 5 이하의 int형 난수를 얻고 싶다면 random.nextInt(5) + 1 와 같이 코드를 작성한다.

3. seed

Random.nextInt()의 내부 - seed 사용

Random.nextInt() 의 내부를 살펴보자.
Random.nextInt()next() 내부에서 this.seed라는 값을 이용해서 정수값을 만들고 있다.

Random 생성자

1. public Random()
랜덤 생성자

  • new Random()으로 객체를 생성하는 경우
  • System.nanoTime()에 알고리즘을 조합해서 랜덤한 seed값을 생성한다.
  • 따라서, 실행할 때마다 seed값이 달라지므로 실행 결과가 달라진다.

2. public Random(long seed)
seed를 받는 랜덤 생성자

  • seed값을 지정하여 객체를 생성하는 경우
  • 반복 실행해도 seed값이 고정되어 있다면 같은 난수들을 반환하므로 실행 결과는 언제나 같다.
  • 테스트 시, 결과를 고정해야 할 때 seed값을 사용하면 좋다.

예시 코드

public class RandomExample {
    public static void main(String[] args) {
        Random randomSeed = new Random();
        int fromRandomSeed = randomSeed.nextInt();
        System.out.println("fromRandomSeed = " + fromRandomSeed);

        Random knownSeed = new Random(10);
        int fromKnownSeed1 = knownSeed.nextInt();
        int fromKnownSeed2 = knownSeed.nextInt();

        System.out.println("fromKnownSeed1 = " + fromKnownSeed1);
        System.out.println("fromKnownSeed2 = " + fromKnownSeed2);
    }
}
  • fromRandomSeed의 값은 코드를 실행할 때마다 랜덤하게 바뀐다.
    (실행 시의 시스템 시간으로 seed를 만들기 때문)
  • fromKnownSeed1은 항상 -1157793070, fromKnownSeed2는 항상 1913984760이 할당된다.
    (주어진 seed 10이 계속 같은 결과를 내기 때문)

+) 재미있는 사실 😬

마인크래프트의 지형 요소, 아이템 드랍 등을 결정하는 값을 Seed라고 한다.
마인크래프트 세계를 만들 때 이를 지정하지 않으면 무작위로 Seed가 생성된다.
내가 플레이하고 싶은 세계가 있을 때, 버전이 같다는 가정 하에 같은 Seed를 입력하면 동일한 세계에서 플레이 하는 것이 가능하다.


참고 사이트

profile
코뉴로그

0개의 댓글