
난수(예측 불가능한 수)를 생성하는 대표적인 2가지 방법: Math.random과 java.util.Random
2가지 방법 모두 의사 난수 (Pseudo random)를 생성하므로 어느 정도의 패턴이 있을 수 있다.
java.lang.Math 클래스의 random 메서드를 통해 간단하게 난수를 생성할 수 있다.
기본 사용 방법
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
Random 클래스의 nextInt 메서드를 통해 threadsafe하게 난수를 생성할 수 있다.
기본 사용 방법
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
여러 스레드가 동시에 난수를 생성할 때, 항상 정확한 결과를 얻을 수 있는 난수
Java의 Random 클래스는 Thread-Safe 하지만, 다중 스레드 환경에서 여러 스레드가 동시에 접근하면 성능이 저하될 수 있다.
[JAVA 7] Random을 상속받아 구현한 ThreadLocalRandom 클래스를 사용 (스레드 별로 별도의 인스턴스를 가지고 각자 동작하도록 고안됌)
[JAVA 8] thread별 Seed값을 각각 설정할 수 있도록 하여 성능을 보완시킴
Random을 상속받아 구현한 SecureRandom 사용