static Random rnd = new Random();
static int random(int n) {
return Math.abs(rnd.nextInt()) % n;
}
n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다.
n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. n이 크면 이 현상이 더 두드러진다.
무작위 수 백만 개 중, 중간 값보다 작은 것의 개수
public static void main(String[] args) {
int n = 2 * (Integer.MAX_VALUE / 3);
int low = 0;
for(int i = 0; i < 1000000; i++)
if(random(n) < n / 2)
low++;
System.out.println(low);
}
50만 개가 아닌 666,666에 가까운 값을 얻는다.
지정한 범위 '바깥'의 수가 종종 나올 수 있다.
rnd.nextInt()가 반환한 값을 Math.abs를 이용해 음수가 아닌 정수로 매핑하기 때문
이런 문제들을 Random.nextInt(int)에서 해결해놨다. 따라서 표준 라이브러리를 사용하면 된다.
🍑 본론
표준 라이브러리를 사용했을 때의 이점
첫 번째, 코드를 작성한 전문가의 지식과 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.
Java 7부터는 Random보다는 ThreadLocalRandom을 사용하면 대부분 잘 작동하며 더 고품질의 무작위 수를 생성할 뿐만 아니라 속도도 더 빠르다.
포크-조인 풀이나 병렬 스트림에서는 SplittableRandom을 사용해라.
포크-조인 풀 : 큰 업무를 작은 업무로 나누어 배분해서, 일을 한 후 일을 취합하는 형태
두 번째, 핵심적인 일과 크게 관련 없는 문제를 해결하느라 시간을 허비하지 않아도 된다.
개발자는 하부 공사를 하기보다는 애플리케이션 기능 개발에 집중하고 싶어 한다.
세 번째, 따로 노력하지 않아도 성능이 지속해서 개선된다.
사용자가 많고, 업계 표준 벤치마크를 사용해 성능을 확인하기 때문에 자바 플랫폼 라이브러리의 많은 부분이 지속해서 재작성되며, 성능이 극적으로 개선되기도 한다.
네 번째, 기능이 점점 많아진다.
라이브러리에 부족한 부분이 있다면 개발자 커뮤니티에서 이야기가 나오고 논의 후 다음 릴리스에 해당 기능이 추가되곤 한다.
마지막, 작성한 코드가 많은 사람에게 낯익은 코드가 된다.
자연스럽게 다른 개발자들이 더 읽기 좋고, 유지보수하기 좋고, 재활용하기 쉬운 코드가 된다.
사람들은 라이브러리에 원하는 기능이 있는지 모르고 구현해서 사용한다.
메이저 릴리스마다 주목할 만한 수많은 기능이 라이브러리에 추가된다.
Java 프로그래머라면 java.lang, java.util, java.io와 그 하위 패키지들은 읽어보고 익숙해져야 한다.
컬렉션 프레임워크와 스트림 라이브러리(item 45 ~ 48), java.util.concurrent의 동시성 기능도 알아두면 큰 도움이 된다.
java.util.concurrent 패키지는 멀티스레드 프로그래밍 작업을 단순화해주는 고수준의 편의 기능은 물론, 능숙한 개발자가 자신만의 고수준 개념을 직접 구현할 수 있도록 도와주는 저수준 요소들을 제공한다. 고수준 개념은 item 80, 81에서 다룬다.
🍑 결론
라이브러리가 필요한 기능을 충분히 제공하지 못할 수 있다.
우선은 라이브러리를 사용하려 시도해보고 원하는 기능이 아니라 판단되면 대안을 사용하자.
Chapter : 9. 일반적인 프로그래밍 원칙
Item : 59. 라이브러리를 익히고 사용하라
Assignee : heon118
🍑 서론
흔하지만 문제가 심각한 코드
무작위 수 백만 개 중, 중간 값보다 작은 것의 개수
이런 문제들을 Random.nextInt(int)에서 해결해놨다. 따라서 표준 라이브러리를 사용하면 된다.
🍑 본론
표준 라이브러리를 사용했을 때의 이점
첫 번째, 코드를 작성한 전문가의 지식과 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.
두 번째, 핵심적인 일과 크게 관련 없는 문제를 해결하느라 시간을 허비하지 않아도 된다.
세 번째, 따로 노력하지 않아도 성능이 지속해서 개선된다.
네 번째, 기능이 점점 많아진다.
마지막, 작성한 코드가 많은 사람에게 낯익은 코드가 된다.
사람들은 라이브러리에 원하는 기능이 있는지 모르고 구현해서 사용한다.
🍑 결론
라이브러리가 필요한 기능을 충분히 제공하지 못할 수 있다.
우선은 라이브러리를 사용하려 시도해보고 원하는 기능이 아니라 판단되면 대안을 사용하자.
Referenced by