개발 기록이

[JAVA] Math.random(), Random 클래스, SecureRandom 클래스로 난수 생성하기 본문

웹 개발/Back-end

[JAVA] Math.random(), Random 클래스, SecureRandom 클래스로 난수 생성하기

studyingbackhoe 2024. 7. 10. 18:51

Java로 난수를 생성하는 방법이 여럿 있는데 대표적인 3가지 방식을 정리해보려고 한다.
 

1. Math.random() 메서드

 

0.0 이상 1.0 미만의 난수가 생성된다. 그러나 Math.random()은 고정된 시드를 설정할 수 없어, 동일한 난수 시퀀스를 재현하기 어렵다는 단점이 있다. 

import java.util.*;

class Main {
    public static void main(String[] args) {
        double num1 = Math.random();
        int num2 = (int)(Math.random()*100); // 0 ~ 100 사이의 난수 생성
        
        System.out.println(num1);
        System.out.println(num2);
    }
}

 

2. Random 클래스

 
Random 클래스의 경우, seed 값을 빈값이 아닌 특정한 값(ex: 40) 동일하게 넣어주면 코드를 실행할 때마다 같은 난수를 출력하게 된다. seed를 따로 지정하지 않으면 현재 시간을 기반으로 시드 값을 자동으로 설정되어 실행할 때마다 새로운 난수가 생성된다.


*시드(seed) : 난수 생성기를 시작할 때 사용하는 초기 숫자
ex) 시드를 레시피라고 생각하면 이해하기 쉽다. 같은 레시피를 가지고 음식을 만들면 항상 동일한 결과가 나온다.

Q: 왜 시드가 같으면 같은 난수가 생성될까?
 
A: 난수 생성기는 의사 난수 생성기(Pseudo-Random Number Generator, PRNG)로 수학적 알고리즘을 사용하여 난수처럼 보이는 숫자 시퀀스를 생성하지만, 실제로는 완전히 예측 불가능한 난수를 생성하는 것이 아니라 초기 상태(시드)에 따라 결정적으로 동일한 숫자 시퀀스를 생성한다.
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random random = new Random(40); // 시드 설정

        double num1 = random.nextDouble();  // 무작위 double 값 생성
        int num2 = random.nextInt(100); // 0 ~ 99까지의 무작위 값 생성

        System.out.println(num1); // 0.7273845313896193
        System.out.println(num2); // 37
    }
}

 

3. SecureRandom 클래스

 

SecureRandom 클래스의 경우, 동일한 시드 값을 넣어줘도 코드를 실행할 때마다 다른 난수를 생성한다. 매우 높은 보안 수준을 제공하기 위해 설계된 클래스로 주로 보안 키를 생성하거나 중요한 정보를 암호화할 때 사용된다.

import java.security.SecureRandom;

class Main {
    public static void main(String[] args) {
        SecureRandom random = new SecureRandom();
        random.setSeed(40); // 시드 설정

        for (int i = 0; i < 10; i++) {
            int num = random.nextInt(100); // 0에서 99 사이의 난수 생성
            System.out.println("Random Number " + (i + 1) + ": " + num);
        }
    }
}

 

정리

  1. Math.random() : 간단하고 기본적인 난수 생성에 적합하지만, 재현성이나 보안적인 요구사항을 충족시키지 못한다.
  2. Random 클래스 : 시드를 설정하여 재현 가능한 난수 시퀀스를 생성할 수 있으며, 일반적인 프로그래밍 상황에서 유용하다.
  3. SecureRandom 클래스 : 보안성을 중시하여 설계되었으며, 암호학적으로 안전한 난수를 생성하는 데 적합하지만 시드를 설정하여도 매번 다른 난수를 생성하여 재현성이 떨어질 수 있다는 단점이 있다.

 

자바 아이콘 제작자: Alfredo Hernandez - Flaticon

출처: https://velog.io/@greentea/java-Random-%EA%B3%BC-SecureRandom
https://kdhyo98.tistory.com/48#%F0%9F%99%84%EC%84%9C%EB%A1%A0-1
https://e-you.tistory.com/214
OpenAI ChatGPT (https://openai.com)
https://www.mycompiler.io/ko/new/java