프로그래밍을 하다보면 특히 게임쪽에서 랜덤(random) 또는 난수 를 생성할 일이 있다.
난수는 무작위 숫자를 뜻하지만 컴퓨터 쪽에선 100% 무작위(랜덤)은 아니다.
정해진 난수표에서 숫자를 가저오는 방식이기 때문이다.


자바(JAVA) 에서 난수를 생성하는 방식은 크게 두가지 이다.


첫번째로 Math.random() 이용하는 방식이다.
Math Class의 random 함수는 double 형 타입으로 0.0 이상 1.0 미만 사이의 값을 반환한다.

 

public class TestRandom {
    public static void main(String[] args) {        
        for(int i =0; i < 10; i++) {
            System.out.print(Math.random()+" ");
        }
        System.out.println("");
    }
}

 

* 결과 값 :

0.1652487713090327 0.286398184817342 0.4336343206580924 0.4295581874855847 0.44636521032290466 0.8715008193305886 0.93917325018134 0.5647002564584279 0.7323427296788428 0.8295767550811228

 

보통은 자연수의 난수가 필요한 경우가 많기 때문에 아래 예제 처럼 0부터 9까지의 난수가 필요하다면 x10을 한 이후에 int형으로 강제 형변환을 시켜주면 된다.

 

public class TestRandom {
    public static void main(String[] args) {        
        for(int i =0; i < 10; i++) {
            System.out.print((int)(Math.random()*10) + " ");
        }
        System.out.println("");
    }
}

 

* 결과 값 :

2 6 3 7 6 9 8 7 9 7 


하지만 이 방식은 직관적이지 않고 형변환등을 하면서 익셉션(Exception) 처리등을 해주어야 하기 때문에 두번째 방식을 추천한다.

 


 

 

 

 

두번째로 Random Class를 이용하는 방식이다.
난수를 생성하는데 필요한 기능 등을 묶어놓은 클레스 이다.
Random Class를 사용하려면 import java.util.Random; 를 해주어야 한다.
Random Class의 맴버변수중에 setSeed를 이용하거나 생성자에 매개변수로 시스템시간을 매개로 전달하면 난수표의 시드값을 초기화 할 수 있다.
아래는 0부터 9까지의 정수를 출력하는 예제이다.

 

import java.util.Random;
 
public class TestRandom {
    public static void main(String[] args) {        
        Random random = new Random(System.nanoTime());
        for(int i =0; i < 10; i++) {
            System.out.print((int)(random.nextInt(10)) + " ");
        }
        System.out.println("");
    }
}


* 결과 값 :


1 3 3 7 6 9 5 7 2 4


아래는 1부터 45까지의 숫자를 출력하는 로또 번호 추첨 예제이다. 랜덤으로 숫자를 추첨하는데 기존에 나왔던 숫자가 있을 경우 다시 재추첨하도록 하였다.

 

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
 
public class TestRandom {
    public static void main(String[] args) {        
        Random random = new Random(System.nanoTime());
        List<Integer> result = new ArrayList<Integer>();
        int num;
        for (int i = 0; i < 6; i++) {
            while (true) {
                num = random.nextInt(45) + 1;
                if (result.contains(num)) {
                    continue;
                } else {
                    result.add(num);
                    System.out.print(num+" ");
                    break;
                }
            }
        }    
        System.out.println("");
    }
}

 

* 결과 값 :

 

12 38 33 29 4 17 

 

 

아래 테이블은 다양한 Random class의 멤버함수 들이다. 이외에도 다양한 함수들이 많이 존재하니 라이브러리를 참고하도록 하자.

함수 설명
nextInt(int i) 0부터 i 까지의 랜덤한 숫자를 리턴
nextInt() Int 타입의 최소 ~ 최대범위 안에서 랜덤한 숫자를 리턴
nextLong() Long 타입의 최소 ~ 최대범위 안에서 랜덤한 숫자를 리턴
nextDouble() Double 타입의 0.0 – 1.0까지의 랜덤한 숫자를 리턴
nextBoolean() boolean타입의 true, false 중 랜덤한 값을 리턴

 

참고 자료 : https://docs.oracle.com/javase/8/docs/api/java/util/Random.html

Posted by 꿈만은공돌
,