ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 유용한 클래스 - 2, java.util.Random 클래스
    Java 2024. 2. 26. 00:24
    728x90
    반응형

    java.util.Random 클래스


    난수를 얻는 Math.random() 외에도 Random 클래스를 사용하면 난수를 얻을 수 있다.
        
    사실 Math.random()은 내부적으로 Random 클래스의 인스턴스를 생성해서 사용하는 것이므로 둘 중에서 편한 것을 사용하면 된다.


    두 문장은 동등하다.       

    double randNum = Math.random();
    double randNum = new Random().nextDouble();


    1~6 사이의 정수 난수

    int num = (int)(Math.random() * 6) + 1;
    int num = new Random().nextInt(6) + 1;          // nextInt(6)은 0~6 사이 정수를 반환


    둘의 가장 큰 차이점이라면, 종자값(seed)을 설정할 수 있다는 것

    종자값이 같은 Random인스턴스들은 항상 같은 난수를 같은 순서대로 반환한다.

    종자값은 난수를 만드는 공식에 사용되는 값으로, 
    같은 공식에 같은 값을 넣으면 같은 결과를 얻는 것처럼 같은 종자값을 넣으면 같은 난수를 얻게 된다.


        

    Random 클래스의 생성자와 메서드

    생성자 Random()은 종자값을 System.currentTimeMillis()로 하기 때문에 실행할 때마다 얻는 난수가 달라진다.

    참고            System.currentTimeMillis()은 현재시간을 천분의 1초 단위로 변환해서 반환한다.

    public Random(){
        this(System.currentTimeMillis());       // Random(long seed)를 호출한다.
    }
    
    import java.util.*;
    class RandomEx1{
        public static void main(String args[]){
            Random rand     = new Random(1);
            Random rand2    = new Random(1);
    
            for(int i = 0; i < 5; i++)
                sysout(i + ":" + rand.nextInt());
    
            for(int i = 0; i < 5; i++)
                sysout(i + ":" + rand2.nextInt());
        }
    }


    rand와 rand2는 항상 같은 값이 나온다.
    같은 종자값을 갖는 Random인스턴스는 시스템이나 실행시간 등에 관계 없이 항상 같은 값을 같은 순서로 반환할 것을 보장한다.

    아래는 그냥 적절한 랜덤 예제를 가져와봤다.        

    데이터베이스에 넣을 테스트 데이터를 만드는 예제

    지금까지는 연속적인 범위 내에서 값을 얻어왔지만,
    때로는 이 예제처럼 불연속적인 범위에 있는 값을 임의로 얻어와야 하는 경우도 있다.

    불연속적인 값을 배열에 저장한 후, 
    배열의 index를 임의로 얻어서 배열에 저장된 값을 읽어오도록 하면 된다.

    import java.util.*;
    
    class RandomEx4{
        final static int RECORD_NUM = 5;       // 생성할 레코드의 수
        final static String TABLE_NAME = "TEST_TABLE";
        final static String[] CODE1 = {"010", "011", "017", "018", "019"};
        final static String[] CODE2 = {"남자", "여자"};
        final static String[] CODE3 = {"10대", "20대", "30대", "40대", "50"};
    
        public static void main(String args[]){
            for(int i = 0; i < RECORD_NUM; i++){
                sysout(" INSERT INTO " + TABLE_NAME + "VALUES 
                (" + " '" + getRandArr(CODE1) + "'"+ ", 
                    '" + getRandArr(CODE2) + "'" + ", 
                        '" + getRandArr(CODE3) + "'" + ", 
                        " + getRand(100, 200) + "); ");
    
            }
        }
    
        public static String getRandArr(String[] arr){
            return arr[getRand(arr.length-1)];              // 배열에 저장된 값 중 하나 반환
        }
    
        public static int getRand(int n) { return getRand(0, n); }
        public static int getRand(int from, int to) {
            return (int)(Math.random() * (Math.abs(to-from) + 1)) + Math.min(from, to);
        }
    }
    
    결과
    INSERT INTO TEST_TABLE VALUES ( '010', '남자', '20대', '123');
    INSERT INTO TEST_TABLE VALUES ( '017', '남자', '40대', '122');
    INSERT INTO TEST_TABLE VALUES ( '011', '여자', '30대', '155');
    INSERT INTO TEST_TABLE VALUES ( '019', '남자', '50대', '143');
    INSERT INTO TEST_TABLE VALUES ( '018', '여자', '40대', '133');


               

    728x90
    반응형
Designed by Tistory.