프로그램을 만들려고 하면 난수가 필요한 때가 자주 있다. 만약 게임을 만든다면 강화 확률이나 명중률 같은 확률적인 부분을 다룰 때 난수가 꼭 필요할 것이다.

자바에서 난수를 발생시키려면 Random 클래스를 이용하면 된다.
다음과 같은 예제를 통하여 알아보자.

다음은 소스코드와 실행 결과이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Random;
 
public class Main
{
    public static void main(String[] args)
    {
        Random rand = new Random();
        
        for (int i=1; i<=5; i++)
        {
            System.out.println(rand.nextInt(5));
        }
    }
}
 
cs


실행해보면 실행시 마다 다른 결과가 출력된다.

소스코드를 들여다보면 rand.nextInt를 호출할 때마다 새로운 수를 뽑아낸다.
nextInt에 넣은 수가 5인데. 0~4 범위의 난수를 뽑아내겠다는 의미이다.



그런데 사실 컴퓨터에서 완벽한 난수란 존재하지 않는다. 그냥 특정한 수식을 통해서 그럴듯 하게 난수처럼 뽑아내는 것이다.
여기서 이상한 점은 수식을 통해서 뽑아낸다면, 항상 실행시 마다 결과가 같아야 한다. 하지만 여기서 그렇지 않은 이유는 Random의 인스턴스를 생성할 때. 생성자 메서드에 아무런 인자를 넘기지 않을 경우 현재 컴퓨터의 시간을 자동으로 초기값으로 사용한다.
만약, 초기값을 지정해준다면 매 실행시마다 같은 결과를 나타낼 것이다. 다음 예제를 통해서 알아보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Random;
 
public class Main
{
    public static void main(String[] args)
    {
        Random rand = new Random(1);
        
        for (int i=1; i<=5; i++)
        {
            System.out.println(rand.nextInt(5));
        }
    }
}
 
cs


실행한 결과 항상 같은 값을 출력한다.
결국 컴퓨터에서 난수라는 것은 그럴듯하게 연출해놓은 것일 뿐이다. 그렇기 때문에 초기값이 같으면 항상 같은 수를 뽑아낸다. 이렇게 그럴듯해보이게 구현한 난수를 의사난수라고 한다.

C와 같은 언어에서는 기본적으로 난수 출력을 할 때. 기본 값을 알아서 넣어주지 않기 때문에 알아서 현재 시간 값을 가져와서 대입시켜줘야 하지만 Java에서는 편리하게 되어 있다.

'프로그래밍 > Java' 카테고리의 다른 글

[Java] 쓰레드 프로그래밍  (0) 2017.01.04
[Java] 익명 클래스 관련 문법 유형들  (0) 2016.08.11
[Java] 구구단 퀴즈  (0) 2016.07.09
[Java] UDP 통신 예제  (0) 2016.07.09