[JAVA] 난수 생성

Yumi Kim·2025년 1월 26일

Java 알고리즘

목록 보기
5/17
post-thumbnail

난수(예측 불가능한 수)를 생성하는 대표적인 2가지 방법: Math.random과 java.util.Random

📌 주의할 점:

2가지 방법 모두 의사 난수 (Pseudo random)를 생성하므로 어느 정도의 패턴이 있을 수 있다.

  • 의사 난수 (Pseudo random): 초기값(Seed)을 이용해 계산식에 의해 흉내낸 랜덤 수
  • 만약 동일한 초기값을 사용한다면 항상 동일한 수열이 생성된다.

Math.random

java.lang.Math 클래스의 random 메서드를 통해 간단하게 난수를 생성할 수 있다.

  • 객체 생성 없이 바로 사용 가능한 정적 메서드
  • 현재 시스템 시간을 seed 값으로 사용
  • 반환값: 0.0 <= double형 난수 < 1.0

기본 사용 방법

Math.random() // 0, 1
Math.random() * 5 // 0, 5 : span
(int) (Math.random() * 5) // 0 ~ 4
(int) (Math.random() * 5) + 1 // 1 ~ 5
(int) ((Math.random() * 5)  *  2) + 1 // 1, 3, 5, 7, 9

범위 지정 방법

(int) (Math.random() * (max - min + 1))  + min // min<= 정수형 난수 < max

✏️ 3 ~ 15 사이의 13개의 수 출력하기

// 15 - 3 = 12
(int) (Math.random() * 12) // 0 ~ 11
// 15 - 3 + 1 = 12 + 1 =13
(int) (Math.random() * 13) // 0 ~ 12
(int) (Math.random() * 13) + 3 // 3 ~ 15 

알파벳 랜덤 발생 방법

(char) (Math.random() * 26)  + 65 // A~Z
(char) (Math.random() * 26)  + 97 // a~z

📌 주의할 점:

아래와 같이 작성할 시 항상 0을 출력한다.

(int) Math.random(); // 0.0 ~ 1.0 실수를 정수 형 변환 -> 0

java.util.Random

Random 클래스의 nextInt 메서드를 통해 threadsafe하게 난수를 생성할 수 있다.

  • 현재 시스템 시간을 seed 값으로 사용
  • 반환값:
    • int nextInt() // int 전 범위에서 난수 발생
    • long nextLong() // long 전 범위에서 난수 발생
    • int nextInt (int n) // 0 <= int형 난수 < n
    • float nextFloat() // 0 <= float형 난수 < 1.0
    • double nextDouble() // 0 <= double형 난수 < 1.0
    • double nextGaussian() // 정규 분포의 난수

기본 사용 방법

  import java.util.Random; // import 패키지 
  Random r = new Random(); // 객체 생성

  int random_int = r.nextInt(5); // 0 ~ 4
  int random_int = r.nextInt(5) + 1; // 1 ~ 5
  double random_double = r.nextDouble(); // 0.0 ~ 1.0

범위 지정 방법

  int random_int = r.nextInt(max - min + 1)  + min // min<= 정수형 난수 < max

기타

*️⃣ threadsafe란?

여러 스레드가 동시에 난수를 생성할 때, 항상 정확한 결과를 얻을 수 있는 난수

Java의 Random 클래스는 Thread-Safe 하지만, 다중 스레드 환경에서 여러 스레드가 동시에 접근하면 성능이 저하될 수 있다.

*️⃣ multi-thread환경에서 성능 개선법?

[JAVA 7] Random을 상속받아 구현한 ThreadLocalRandom 클래스를 사용 (스레드 별로 별도의 인스턴스를 가지고 각자 동작하도록 고안됌)
[JAVA 8] thread별 Seed값을 각각 설정할 수 있도록 하여 성능을 보완시킴

*️⃣ 의사 난수의 문제 개선법?

Random을 상속받아 구현한 SecureRandom 사용

  • Random : 선형 합동 생성기 (LCG) 알고리즘
  • SecureRandom : 중복 발생이 힘들고 보안적으로 더 안전한 CSPRNG 알고리즘
profile
✿.。.:* ☆:**:. 🎀 Daily Study 🎀 .:**:.☆*.:。.✿

0개의 댓글