관리 메뉴

드럼치는 프로그래머

[JAVA] java에서 random숫자 생성하기(난수추출법) 본문

★─Programing/☆─JAVA

[JAVA] java에서 random숫자 생성하기(난수추출법)

드럼치는한동이 2007. 10. 5. 17:45

자바에서 Random값을 구하는 방법으로는 크게 다음 두가지가 있다.

  1) java.lang.math.Random

  2) java.util.Random


이때 첫번째 방법은 seed값을 변환할 수 없기 때문에 고르게 분포하지 않는다.

그래서 seed값을 변환해 고른 난수추출을 할 수 있는 방법이 필요한데 이때,

두번째 방법을 사용한다. 아래의 예제는 아주 간단히 정규분포(Normal / Gaussian)에서

난수를 추출하는 방법을 보여주고 있다.

---------------------------------------------------------------------------------------

import java.util.Random;


public class RandomNumber {

    public static void main(String[] args) {
        Random rand = new Random(System.currentTimeMillis()); // seed값을 배정하여 생성
        System.out.println(Math.abs(rand.nextGaussian()));         // 난수값 출력

    }

}

----------------------------------------------------------------------------------------


아래의 예제는 다양한 범위에서 난수를 추출하는 방법을 보여주고 있다.

---------------------------------------------------------------------------------------

import java.util.Random;


public class RandomNumber {

    public static void main(String[] args) {
        Random rand = new Random(System.currentTimeMillis()); // seed값을 배정하여 생성
        System.out.println(Math.abs(rand.nextInt(10)));                //0~10사이의 난수값생성
        System.out.println(Math.abs(rand.nextInt(9)+1));               //1~10사이의 난수값생성
        System.out.println(Math.abs(rand.nextInt(990)+10));           //10-100사이의 난수값생성

    }

}

----------------------------------------------------------------------------------------

nextInt([숫자])를 사용할경우 0~[숫자]까지의 범위에서 난수가 추출되므로 예로 0~9까지 난수를

추출한후 1을 더해주면 1~10까지의 난수가 추출됨.



** 참고사항 : 컴퓨터상에서 난수추출과 Seed값 배정법(출처 : 네이버 지식검색 자료모음)


컴퓨터는 생각을 할 수 없습니다. 그래서 무작위로 수를 뽑는 것 역시 불가능합니다.
단, 엄청나게 긴 수열을 만들어 내어서 "난수"로 보이는 숫자를 만들어 낼 수 있는데
그것이 유사 난수(Pseudo random)이라고 합니다.
단, 이 수열의 집합은 Seed라는 지정번호에 좌우되는데(Seed가 같을 경우, random을

해도 같은 수열만 나온단 말이 되겠죠) Seed의 숫자에 따라서 생성되는 수열이 달라집니다.

프로그래머들은 Seed 번호를 대개 현재의 시각에 대응시킵니다. 그래서 한번의 Random

호출시마다 다른 난수가 생성됩니다. 즉 명령을 실행하라고 인간이 엔터키나 클릭을 한

시점의 시간을 1000분의 1초를 단위로 추출해서 그 수를 기본으로 난수를 만들기 때문에

언제나 실행 할때마다 전혀 다른 난수가 나오게 되는것입니다.


최종적으로는, seed를 and or xor 등등을 여러번 섞고 왼쪽 오른쪽으로 돌렸다가 비트단위로

반정도로 잘라서 뒤섞고 하는방식으로 만듭니다.

Comments