Java 랜덤 수 생성 Java

Random.java

Java에서 랜덤 수는 java.lang 팩키지의 Math클래스를 이용하면 된다.
Math 클래스에서 random()메소드를 이용하면 쉽게 난수를 생성할수 있다.
  • public static double random()
    • return : double 의 유사 난수. 범위는 0.0 이상 1.0 미만
그러나 이 메소드는 제약이 있다. 이유는 seed값이 없기 때문에 난수가 전체적으로 고르게 분포하지 않는다는 것이다.
그래서 seed 값을 줄 수 있는 java.util 팩키지의 Random클래스가 존재한다.
Rodom클래스에서 nextInt(int n)메소드를 통해서 정수형 난수를 생성한다.
  • public int nextInt(int n)
    • parameter : return 되는 난수의 한계치
    • return : 0 ~ n 의 범위 (0 은 포함하지만, n 는 포함하지 않는다) int 형 유사 난수
실제 소스를 살펴보자.
public class Random {
   
    public static void main(String[] args)
    {
        double r1 = Math.random();
        System.out.println("r1 : " + r1);
       
        // 0~9까지의 랜덤 수
        int r2 = (int)(Math.random()*10)%10;
        System.out.println("r2 : " + r2);
        int r3 = (int)(Math.random()*10)%10;
        System.out.println("r3 : " + r3);
       
        //java.util의 Random클래스
        java.util.Random rand = new java.util.Random();
       
        // 0~9까지의 랜덤 수
        int r4 = rand.nextInt(10);
        System.out.println("r4 : " + r4);
       
        // 0~99까지의 랜덤수
        int r5 = rand.nextInt(100);
        System.out.println("r5 : " + r5);
       
        // 랜덤 수를 배열에 저장하기
        int[] r6 = new int[10];   
       
        for(int i = 0; i < 10; i++){
            r6[i] = rand.nextInt(100);
        }
       
        for(int i = 0; i < 10; i++){
            System.out.print(r6[i]+" / ");
        }
       
    }

}
『 컴퓨터에서 난수 표현의 한계』 — [출처 - 네이버 지식 검색]
컴퓨터는 생각을 할 수 없습니다. 그래서 무작위로 수를 뽑는 것 역시 불가능합니다. 단, 엄청나게 긴 수열을 만들어 내어서 “난수”로 보이는 숫자를 만들어 낼 수 있는데 그것이 유사 난수(Pseudo random)이라고 합니다. 단, 이 수열의 집합은 Seed라는 지정번호에 좌우되는데(Seed가 같을 경우, random을 해도 같은 수열만 나온단 말이 되겠죠) Seed의 숫자에 따라서 생성되는 수열이 달라집니다. 프로그래머들은 Seed 번호를 대개 현재의 시각에 대응시킵니다. 그래서 한번의 Random 호출시마다 다른 난수가 생성됩니다. 즉 명령을 실행하라고 인간이 엔터키나 클릭을 한 시점의 시간을 1000분의 1초를 단위로 추출해서 그 수를 기본으로 난수를 만들기 때문에 언제나 실행 할때마다 전혀 다른 난수가 나오게 되는것입니다.
최종적으로는, seed를 and or xor 등등을 여러번 섞고 왼쪽 오른쪽으로 돌렸다가 비트단위로 반정도로 잘라서 뒤섞고 하는방식으로 만듭니다.

덧글

댓글 입력 영역