바퀴를 다시 발명하지 말자
책에서 나온 무작위 정수 생성 예제
public class TestMain {
static Random rnd = new Random();
static int random(int n){
return Math.abs(rnd.nextInt()) % n;
}
public static void main(String[] args) {
int n = 2 * (Integer.MAX_VALUE / 3);
int low = 0;
for (int i = 0; i < 1_000_000; ++i)
if (random(n) < n/2)
low++;
System.out.println(low);
}
}
여러가지 문제를 내포하고 있다.
-
n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다.
-
n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다.
- 위 예제에서 난수라면 평균적으로 low의 값이 50만으로 나와야하지만, 66만에 가
-
지정한 범위 바깥의 수가 튀어나올 수 있는 조건이 있다.
-
rnd.nextInt()
가Integer.MIN_VALUE
를 반환하면 결과적으로 음수가 반환될 수 있다.# 우리가 예상한 것 - `Integer.MIN_VALUE` (-2_147_483_648) → `Math.abs()` → +2_147_483_648 # 하지만 `Integer.MAX_VALUE` = 2_147_483_647 # 즉 abs를 통해 변환한 값이 `Integer.MAX_VALUE`보다 크다 => +2_147_483_648 = -2_147_483_648 => 결국, abs 결과가 음수 -2_147_483_648가 반환된다.
-
-
왜 이러한 문제가 있을까? 수학적인 이야기! 참고
Effective Java Item 47: Know and use your libraries - Flawed random integer method example
- 음의 정수, 부호비트, 보수 관련해 찾아보시길 !
위 결함을 해결하기 위해선 난수 생성기, 정수론, 2의 보수 계산 등을 알아야 할 것
→ 이걸 일반 프로그래머가 신경쓰며 개발할 수 있을까?
→ 이걸 해결한 Random.nextInt(integer)
를 사용하자.
→ 근데 사실 Random
쓰지말라고 한다. → 뒤에서 확인
위 과정처럼 생각을 하려면 ? → 라이브러리에 대해 이해하고 익히고 사용하자.
자바 7부터는 Random
사용하지말고, ThreadLocalRandom
으로 대체하자.
만약 포크-조인 풀, 병렬 스트림인 경우라면, SplittableRandom
을 사용하자.
- 고품질의 무작위 수를 반환하며 속도도 더 빠르다.
Random
→ LCG 알고리즘 → 결과의 패턴 존재 → 보안적인 난수에는 사용해서는 안된다.
다른 난수 생성 알고리즘을 사용하고 싶다면 java.security.SecureRandom
사용!
Java Random - ThreadLocalRandom, SplittableRandom, SecureRandom
애플리케이션 기능 개발에 집중할 수 있다.
사용자가 많고, 업계 표준 벤치마크를 사용해 성ㄴ
부족한 부분에 대해서 개발자 커뮤니티 등에서 논의가 계속되고, 이를 보완해 릴리즈에 기능이 추가되기도 한다.
읽기 좋고, 유지보수하기 좋고, 재활용하기 좋다
아마도 라이브러리에 그러한 기능이 있는지 모르기 때문
→ 메이저 릴리즈마다 주목할 만한 수많은 기능이 라이브러리에 추가된다. Java는 메이저 릴리즈 때마다 새로운 기능을 설명하는 웹페이지를 공시
Consolidated JDK 8 Release Notes
Consolidated JDK 11 Release Notes
java.lang
java.util
java.io
Collection framework
Stream
java.util.concurrent
The Guava library: What are its most useful and/or hidden features?
- Apache Commons Lang: https://github.com/apache/commons-lang
An Introduction to Apache Commons Lang 3 | Baeldung
Apache Commons Lang StringUtils - DZone Java
https://www.baeldung.com/apache-commons-collections-vs-guava