상세 컨텐츠

본문 제목

Concurrent Random Number

Java

by Wanderer Kim 2024. 9. 24. 18:41

본문

728x90

특정한 랜덤 숫자 값을 구하는 방법 몇 가지를 알아본다

java.util.Random 이용

int high = 1000;
int low = 100;
Random random = new Random();

for(int i=0; i<100; i++){
	System.out.println(random.nextInt(high - low) * low);
}

Random 클래스틑 특정 값을 기준으로 int, long, double, float 등의 값을 불특정하게 생성할 수 있으며 위의 예제는 하윗값과 상윗값 사이의 값을 생성하기 위해 응용한 것이다.

 

java.math 이용

int high = 1000;
int low = 100;
for(int i=0; i<100; i++){
	System.out.println((int)(Math.random() * (high - low)) * low);
}

Math.random 메서드는 0.0부터 1.0 사이의 double 값을 무작위로 리턴한다. 그래서 특정한 하윗값과 상윗값 사이에서 새로운 번호를 받고자 한다면 그 값만큼 곱패주면 된다.

이렇게 새로운 번호를 랜덤으로 받는 좋은 기능이  제공됨에도 불구하고 concurrent API에서 별도의 숫자 채번 기능을 제공하는 이유는 성능 때문이다.

자바 API 문서를 찾아보면 Random 클래스가 멀티 스레그 환경에서 안전하다고 설명하고 있지만, 사실 나쁜 성능 때문에 많은 논쟁이 있는 클래스이다.

 

java.util.concurrent.ThreadLocalRandom

ThreadLocalRandom 클래스는 기능적으로나 개념저긍로 ThreadLocal과 Random을 합쳐 놓은 것이다.

import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.IntStream;

public class ThreadLocalRandomExample{
	private int high;
    private int low;
    
    public ThreadLocalRandomExampl(int low, int high){
    	this.low = low;
        this.high = high;
    }
    
    public void generateRandomJava7(){
    	System.out.println("# Javga 7 방식 #");
        for(int i=0; i<100; i++){
        	System.out.println(ThreadLocalRandom.current().nextInt(low, high));
    }
    
    public void generateRandomJava8(){
    	System.out.println("# Java 8 방식 #");
        IntStream intStream = ThreadLocalRandom.current(0.ints(100, low, high);
        intStream.forEach((value) -> System.out.println(value));
    }
    
    public static void main(String[] args){
    	ThreadLocalRandomExample example = new ThreadLocalRandomExample(100, 1000);
        example.generateRandomJava7();
        example.generateRandomJava8();
    }
}

 

우선 ThreadLocalRandom 객체를 생성하는 방법은 다음과 같다.

ThreadLocalRandomExample example = new ThreadLocalRandomExample(100, 1000);

별도의 생성자는 없고 current 메서드를 이용해서 객체 생성 작업을 수행한다.

그 이후 스트림 방식으로 난수를 생성할지, 메서드 호출응ㄹ 통해 난수를 생성할지 결정하면 된다.

자바 APi 문서를 살펴보면 크게 다음과 같이 메서드가 구분되는 것을 볼 수 있다.

  • 이름이 next로 시작하는 메서드 : next 뒤에 있는 데이터형에 맞게 랜덤 숫자가 생성된다.
  • 리턴 타입이 IntStream, DoubleStream인 메서드 : 스트림 객체를 리턴하며, 리턴받은 스트림 객체를 이용해서 난수를 구한다.
반응형

'Java' 카테고리의 다른 글

[자바 성능 튜닝] 성능 테스트 접근법  (0) 2024.04.07
ThreadLocal  (1) 2024.02.28
JVM 메모리 관리  (0) 2023.05.29
Stream API 개요  (0) 2023.05.05
CompletableFuture get()과 join()의 차이점  (0) 2023.05.02

관련글 더보기

댓글 영역