Search

반응형

'자바난수'에 해당되는 글 1건

  1. 2020.05.08 [자바]Random 클래스로 난수를 만들어 보기 - long seed, java.util.Random;
반응형

안녕하세요. 신기한 연구소의 티보이입니다.

이번은 자바 프로그램을 개발하다 보면 가끔 사용하는 Random(난수) 클래스에 대해 알아볼게요.

개발에 잘 활용하세요~

Random클래스란?

순서가 없는 연속적인 임의의 수를 난수라고 합니다.

난수를 만들어 주는 클래스가 Random클래스이며 java.util 패키지에 포함되어 있습니다.

import java.util.Random; 

 

생성자.

Random r = new Random(); //기본 생성자기본생성자 

Random r = new Random(long seed); //seed 설정 생성자 

 

메서드.

Next, nextBoolean, nextDouble, nextFloat, nextGaussian, nextInt, nextLong, setSeed 

 

사용 예.

우선 기본 생성자를 사용해서 객체를 인스턴스화 하고 자주 사용하는 nextInt() 메서드를 이용하면 난수를 얻을 수 있습니다.

1
2
3
Random r101 = new Random();
                
System.out.println(r101.nextInt());
cs

 

결과 

-2057661722
1761664520

이때 만들어지는 난수는 양수, 음수 상관없이 숫자의 크기도 맘대로 불규칙적으로 만들어집니다.

로또 숫자처럼 원하는 범위 내에서 만들고 싶다면 nextInt메서드에 범위 값을 넘겨주면 됩니다.

1
2
3
4
5
6
7
8
9
        Random r0 = new Random(); 
        
        System.out.println(r0.nextInt(1000));
        System.out.println(r0.nextInt(1000));
        
        Random r1 = new Random(); 
        
        System.out.println(r1.nextInt(1000));
        System.out.println(r1.nextInt(1000));    
cs

 

결과.
950
148
888
607

r0 객체로 random 난수를 만드는데 "1000"이라는 범위를 설정했습니다. nextInt(1000);

이 범위 안의 정수값이 임의로 표출됩니다.

또한 r0객체에서 연속으로 nextInt 를 사용하거나 또는 새로 r1객체를 사용해서 만들거나 항상 새로운 난수를 주어진 범위 내에서 만들게 됩니다.

보통 이 정도면 기본적인 난수를 만들어 사용하는데 문제가 없습니다.

 

두 번째 seed를 사용하는 생성자를 보겠습니다..

특징은.

Seed값을 넣으면 이 초기값을 가지고 난수를 만듭니다.

기본 생성자와 다른 점은,

기본 생성자는 객체를 인스턴스화 할 때나 또는 nextInt() 메서드를 실행할 때마다 위 예제처럼 중복될 가능성이 거의 없는 새로운 난수를 만듭니다.

Seed값을 받는 생성자는 객체를 인스턴스화 할 때는 계속 같은 값을 만듭니다.

1
2
3
4
5
6
7
8
9
        Random r2 = new Random(8); 
            
        System.out.println(r2.nextInt(1000));
        System.out.println(r2.nextInt(1000));
        
        Random r3 = new Random(8); 
        
        System.out.println(r3.nextInt(1000));
        System.out.println(r3.nextInt(1000));    
cs
결과.
364
956
364
956

결과를 확인해 보면 r2와 r3의 seed 값이 "8"로 같습니다.

다른 Random클래스 객체로 인스턴스화 했지만,

1000 범위값의 난수는

364로 같습니다.

하지만 한 번 인스턴스화 한 상태에서 nextInt()만 호출 시 다른 값을 만듭니다.

중요한 것은 이렇게 만들었다고 해도 다시 객체를 인스턴스화 하면 또 같은 순서대로 난수가 나옵니다. 규칙적 난수라고 하면 될까요?

위 예제를 보면 r2나 r3로 다시 종료하고 실행해도 같은 값이 순서대로 나옵니다.

seed값을 다르게 넣거나 범위값이 다르게 넣으면 다른 난수가 규칙적으로 나옵니다.

위 메서드 목록에 보면 setSeed가 있는데,

일반 생성자로 생성한 Random 클래스 객체를 해당 메서드를 통해 중간에 seed값을 설정할 수 있게 해줍니다.

정리해 보면,

일반 생성자로 만든 난수는 로또 번호 자동 생성기 같이 수시로 그때마다 다르게 조건에 맞는 난수가 필요한 경우에 사용하면 됩니다.

Seed를 받는 생성자의 경우는 난수를 만든다는 것은 같지만 seed값에 의해 객체가 인스턴스화 될 때마다 같은 난수를 만들어 주기에 그에 맞는 용도로 사용하면 됩니다.

예를 들어 데이터베이스에 보안상의 이유로 직원의 인증번호를 그대로 입력하면 안 되는 상황이 있다고 가정합니다. 직원이 인증번호를 저장할 때 seed값에 인증번호를 넣고 난수를 받아서 저장하면 데이터베이스에는 직원의 인증번호가 저장되지 않고 생성된 난수가 저장 됩니다.

이후 인증 시도 시 직원이 인증번호를 seed로 해서 난수로 만든 수와 데이터베이스의 난수와 비교했을 때 같으면 인증이 되도록 할 수 있겠네요.

이런 방식을 응용해서 잘 활용하면 될 듯합니다.

마치겠습니다. 즐코딩 하세요~

반응형