Java 에서 난수(random number) 생성하기

프로그래밍/자바 2018. 4. 20. 21:51
반응형

Java에서 난수를 발생시키는 방법을 두 가지가 있습니다. java.lang.Math 클래스의 정적메소드인 random() 메소드를 사용하는 방법과 java.util.Random 클래스를 사용하는 방법 입니다. 발생되어지는 난수는 Pseudo Random Number(의사 난수) 입니다. 이상적인 난수에 가까운 난수 입니다.


난수를 발생시킬때는 seed값에 대한 이해가 필요합니다. seed 값이란 간단히 말해서 난수를 발생하는데 기준이 되는 값이라고 생각하면 될것 같습니다.


예로 난수를 발생하는 객체 두 개를 동일한 seed로 생성하면  두 객체가 발생하는 난수는 같은 값이 동일한 순서로 발생되어 집니다. 동일한 조건하의 반복되는 시뮬레이션 등에 사용되어질 수 있겠습니다.


대부분의 경우는 현재 시간등 계속 변하는값을 seed로 사용하면 항상 다른 난수가 발생되도록 하는 것이 일반 적입니다.



1. Math.random() 사용하기


Math 클래스는 java.lang 패키지에 있으므로 별도로  import 할 필요가 없습니다. Math 클래스의 random() 메소드는 정적(static) 메소드이므로 객체를 생성하지 않고 Math.random(); 으로 바로 사용할 수 있습니다. 이 메소드는 현재 시간을 seed로 사용합니다.


for(int i = 0; i < 5; i++) {

    double dValue = Math.random();

    

    System.out.println(dValue);

}


결과)

0.6564628951664216

0.291998526814751

0.5208022473820823

0.8888650101288209

0.3043572262163168



Math.random(); 메소는 0.0 이상, 1.0 미만의 double 값의 난수를 균일한 분포로 반환합니다. 0 ~ 9 사이의 정수형 난수를 만들고 싶다면 다음과 같이 발생된 double 형 난수에 10을 곱한 후 정수로 캐스팅 하면 되겠습니다.


for(int i = 0; i < 100; i++) {

    double dValue = Math.random();

    int iValue = (int)(dValue * 10);

    

    System.out.println(iValue);

}


알파벳을 랜던하게 발생시키고 싶다면 다음과 같이 하면 되겠습니다.


for(int i = 0; i < 100; i++) {

    double dValue = Math.random();

    char cValue = (char)((dValue * 26) + 65);   // 대문자

    //char cValue = (char)((dValue * 26) + 97); // 소문자

    

    System.out.println(cValue);

}


알파벳이 26자 이므로 0 ~ 26 까지의 난수를 발생시킵니다. 알파벳 대문자는 ASCII 코드에서 65번째 부터 대문자 A 가 나오므로 65를 더한후 char 타입으로 캐스팅하면 알파벳 대문자를 랜던하게 발생시킬 수 있습니다. 같은 방법으로 알파벳 소문자는 97번째 부터 나오므로 97을 더해주면 됩니다. ASCII 코드표를 찾아보고, 특수문자 등 필요한 문자를 발생 시킬 수도 있을 것입니다.



2. Random 클래스 사용하기


Random 클래스는 java.util 패키지에 있으므로 사용시 import가 필요합니다.


import java.util.Random;



2.1 Random 객체 성성하기


- 기본 생성자를 사용해서 생성하면 현재 시스템 시간을 seed 값으로 가지는 Ramdom 객체를 생성합니다.


Random rand = new Random();


- seed 를 지정하여 객체를 생성하는 방법 입니다. long 타입의 seed 를 생성자의 인자로 줍니다.


long seed = System.currentTimeMillis();

Random rand = new Random(seed);


- 생성후 seed 를 변경하기 위해서 setSeed(long seed) 메소드를 사용할 수 있습니다.


rand.setSeed(System.currentTimeMillis());



2.2 난수 발생 메소드 사용하기


- boolean nextBoolean() : 균일한 분포의 boolean 형 난수 발생

- int nextInt() : 균일한 분포의 int 형 난수 발생(int 전 범위에서 난수가 발생합니다.)

- long nextLong() : 균일한 분포의 long형 난수 발생(long 점 범위에서 난수가 발생합니다.)

- int nextInt(int n) : 균일한 분포의 0이상 n 미만의 int형 난수 발생

- float nextFloat() : 균일한 분포의 0.0이상 1.0 미만의 float형 난수 발생

- double nextDouble() : 균일한 분포의 0.0이상 1.0 미만의 double형 난수 발생

- double nextGaussian() : 정규 분포의 난수를 발생합니다.(평균이 0이고, 표준편차가 1인 분포 입니다.)



0 ~ 9 사이의 난수를 발생시키기 위해서 다음과 같이 사용할 수 있습니다.


import java.util.Random;

...

Random rand = new Random();


for(int i = 0; i < 100; i++) {

    int iValue = rand.nextInt(10);  // 0 <= iValue < 10

    

    System.out.println(iValue);

}

반응형

댓글을 달아 주세요