Math.Random()

로또를 만드는 등에서 난수가 필요할 때, 우리는 다음과 같은 메서드를 사용한다.

public class random{
	public static void main(String[] args){
		int num1 = (int)Math.random()*10+1;
		int num2 = new Random(10).nextInt(6);
    }
}

그 중, 우리가 일상적으로 많이 쓰는 Math.random() 클래스는 정말 난수를 생성하는지에 대해서 궁금해졌다.

 

난수

위키피디아에 따르면 난수의 정의는 다음과 같다.

난수(亂數)란 정의된 범위 내에서 무작위로 추출된 수를 일컫는다.
난수는 누구라도 그 다음에 나올 값을 확신할 수 없어야 한다.

난수란 1.정의된 범위 내에서 2.무작위로 추출된 수를 일컫고 3.누구라도 다음에 나올 값을 확신할 수 없어야 한다.

그런데, 컴퓨터가 만드는 난수의 값은 정말 난수일까?

Math.random()의 API

먼저 random함수는 RandomNumberGenerator를 이용한 double값을 리턴한다.

randomNumberGenerator값을 타고 들어가보려 했으나, 나오지 않았다.

이는 악용 가능성 때문에 자바에서 난수를 생성하는 원칙을 보여주지 않으려고 해서 그렇다고 한다.

 

컴퓨터는 자연의 부산물이 아니다.

나중에 '컴퓨터의 1초는 어떻게 측정할까'에 대해 포스팅 하겠지만, 컴퓨터는 절대 자연을 따라올 수 없다.

코드는 인간이 짜고 인간이 만든 컴퓨터라는 결과물에서 그 결과를 출력한다.

난수 생성또한 마찬가지로, 그래서 정확하게는 random number가 아닌, pseudo-random number(유사 난수)라고 한다.

위에서 기술한 Random class의 메소드도, currentMillis를 이용한 시간을 받아 만든 난수 생성이기 때문에 완벽한 난수라고는 할 수 없다.

따라서 보안용으로는 random 메소드를 사용하지 말고, 대신 데이터를 실험하기엔 더없이 좋은 메소드이니 그럴 때 사용하도록 하자! :)

'자바' 카테고리의 다른 글

TIL - 좋은 객체지향적 설계원칙, SOLID(3) : LSP  (0) 2023.01.27
TIL - OOP 요약  (0) 2023.01.25
TIL - THE JAVA(3), NPE와 NULL  (1) 2023.01.20
TIL - THE JAVA(2) Flow Chart  (0) 2023.01.20
TIL - THE JAVA(1), JVM  (0) 2023.01.19

+ Recent posts