[Day 7 | Java] Random

y♡ding·2024년 10월 22일
0

데브코스 TIL

목록 보기
33/163

1. Random 클래스 사용법

Random 클래스는 정수, 실수, 불리언 등 다양한 난수를 생성할 수 있습니다. 난수 생성의 기본은 내부적으로 시드 값에 따라 의사난수를 생성한다는 점입니다. 시드를 지정하지 않으면 현재 시간에 기반한 시드 값이 사용됩니다.


2. Random 클래스 생성자

1) Random()

  • 기본 생성자로, 현재 시간을 바탕으로 시드 값을 자동으로 생성합니다.

2) Random(long seed)

  • 사용자가 지정한 시드 값을 사용하여 Random 객체를 생성합니다. 같은 시드 값을 사용할 경우, 항상 동일한 난수 시퀀스가 생성됩니다.

3. 주요 메서드

1) nextInt()

  • 랜덤한 정수를 생성합니다. 파라미터 없이 호출하면 모든 범위의 정수를 반환하고, 파라미터를 전달하면 0부터 n-1까지의 범위에서 정수를 반환합니다.

2) nextInt(int bound)

  • 0부터 bound - 1 사이의 정수를 생성합니다. bound 값을 지정하면 그 값보다 작은 정수를 생성할 수 있습니다.

3) nextDouble()

  • 0.0 이상 1.0 미만실수(double) 값을 생성합니다.

4) nextBoolean()

  • 랜덤한 불리언(boolean) 값을 생성합니다. 즉, true 또는 false 값을 무작위로 반환합니다.

4. 난수 시드(Seed)

Random 클래스에서 생성되는 난수는 시드 값에 따라 결정됩니다. 같은 시드 값을 사용하면 항상 같은 난수 시퀀스가 생성됩니다.

  • 시드 값이 없는 경우: 기본적으로 현재 시간을 기준으로 시드를 생성하여 매번 다른 난수가 생성됩니다.
    * 시드 값을 지정한 경우: 지정한 시드 값에 따라 동일한 난수 시퀀스가 반복해서 생성됩니다. 이를 통해 테스트나 디버깅 시 같은 랜덤한 결과를 얻고 싶을 때 유용하게 사용됩니다.

    예시: 같은 시드 값으로 동일한 난수 생성


5. Random 클래스의 주의사항

  • 멀티스레드 환경에서 Random 클래스는 스레드 안전하지 않음. 만약 멀티스레드 환경에서 난수를 생성해야 한다면, ThreadLocalRandom 클래스를 사용하는 것이 더 적합합니다.
  • 동일한 시드 값을 여러 번 사용하면, 항상 같은 난수 시퀀스가 생성되므로 테스트와 디버깅에서 유용하지만, 실제 난수를 사용해야 하는 경우에는 시드를 사용하지 않거나 랜덤한 시드를 사용해야 합니다.
import java.util.Random;

public class RandomExample {
    public static void main(String[] args) {
        // Random 객체 생성 (시드 없이 생성 -> 현재 시간을 기반으로 랜덤한 시드가 설정됨)
        Random random = new Random();

        // 1. nextInt() : 모든 범위에서 랜덤 정수 생성
        int randomInt = random.nextInt(); // -2^31 ~ 2^31-1 사이의 정수
        System.out.println("랜덤 정수 (모든 범위): " + randomInt);

        // 2. nextInt(bound) : 0부터 bound-1 사이의 랜덤 정수 생성
        int randomBoundedInt = random.nextInt(100); // 0부터 99까지의 정수
        System.out.println("랜덤 정수 (0 ~ 99): " + randomBoundedInt);

        // 3. nextDouble() : 0.0 이상 1.0 미만의 랜덤 실수 생성
        double randomDouble = random.nextDouble(); // 0.0 <= x < 1.0
        System.out.println("랜덤 실수 (0.0 ~ 1.0 미만): " + randomDouble);

        // 4. nextFloat() : 0.0 이상 1.0 미만의 랜덤 float 생성
        float randomFloat = random.nextFloat(); // 0.0 <= x < 1.0
        System.out.println("랜덤 float (0.0 ~ 1.0 미만): " + randomFloat);

        // 5. nextBoolean() : 랜덤한 true 또는 false 값 생성
        boolean randomBoolean = random.nextBoolean(); // true 또는 false
        System.out.println("랜덤 불리언: " + randomBoolean);

        // 6. nextLong() : 랜덤 long 값 생성
        long randomLong = random.nextLong(); // -2^63 ~ 2^63-1 사이의 long 타입 값
        System.out.println("랜덤 long: " + randomLong);

        // 7. nextGaussian() : 정규분포(평균 0, 표준편차 1)에서 난수 생성
        double randomGaussian = random.nextGaussian(); // 평균 0, 표준편차 1의 정규분포
        System.out.println("랜덤 Gaussian 값: " + randomGaussian);

        // 8. 시드 값을 이용한 난수 생성
        Random seededRandom = new Random(12345); // 시드 12345를 사용하여 난수 생성기 초기화
        int seededRandomInt = seededRandom.nextInt(100); // 시드가 같으면 항상 같은 결과
        System.out.println("시드 기반 랜덤 정수 (0 ~ 99): " + seededRandomInt);

        // 9. 배열에서 무작위 인덱스를 선택해 요소 출력
        String[] fruits = {"사과", "배", "수박", "참외", "딸기"};
        int randomIndex = random.nextInt(fruits.length); // 0부터 배열 길이-1까지 인덱스 생성
        System.out.println("랜덤 과일 선택: " + fruits[randomIndex]);

        // 10. ThreadLocalRandom 예시 (멀티스레드 환경에서 사용 권장)
        // ThreadLocalRandom.current().nextInt(0, 100): 0부터 99까지의 랜덤 정수 생성
        int threadLocalRandomInt = java.util.concurrent.ThreadLocalRandom.current().nextInt(0, 100);
        System.out.println("ThreadLocalRandom을 사용한 랜덤 정수 (0 ~ 99): " + threadLocalRandomInt);
    }
}

0개의 댓글

관련 채용 정보