[210316] java에서 난수 생성하기 - Math.random()과 Random 클래스
Math.random()
많이 사용되는 java 내장 Math 클래스에서 난수 생성 함수인 ramdom()을 사용할 수 있다.
double number;
int numberHasRange;
// 난수 얻기
number = Math.random();
System.out.println("number = " + number);
// 0 ~ 10 사이의 난수 얻기
numberHasRange = (int)(Math.random() * 10);
System.out.println("numberHasRange = " + numberHasRange);
Math.random() 호출 시, 0.0 이상 1.0 미만의 난수가 double 형태로 반환된다.
일정 범위 이상의 난수를 얻고싶다면 (int)(Math.random() * 10) 처럼 수를 곱해서 조정해주어야 한다.
Math 클래스의 소스도 확인해봤다. 호출 시, Math 내부에서는 Random 형의 변수인 randomNumberGenerator를 사용해서 난수를 생성하는 모양이다. 결국 Math.random()도 내부적으로는 Random 클래스를 사용한다.
RandomNumberGeneratorHolder 클래스 안에 정적 변수 randomNumberGenerator가 있음을 확인할 수 있다.
java.util.Random
Random 클래스는 의사 난수 스트림을 생성한다.
int randomInt;
double randomDouble;
// Random 객체 생성
Random random = new Random();
// int 형의 난수 생성
randomInt = random.nextInt();
System.out.println("randomInt = " + randomInt);
// double 형의 난수 생성
randomDouble = random.nextDouble();
System.out.println("randomDouble = " + randomDouble);
- 주요 메소드
1. Stream 형태로 난수 생성
public DoubleStream doubles()
- 0에서 1 사이의 난수를 제한 없이 생성하는 스트림을 return한다.
public IntStream ints()
- int 값을 제한 없이 생성하는 스트림을 return한다.
public LongStream longs()
- long 값을 제한 없이 생성하는 스트림을 return한다.
ex1)
Random random = new Random();
System.out.println("double 난수 출력");
DoubleStream ds = random.doubles();
ds.limit(5).forEach(value -> System.out.println(value));
또한, parameter로 stream의 크기를 설정할 수도 있다.
ex2)
Random random = new Random();
System.out.println("long 난수 출력");
LongStream ds = random.longs(5);
ds.forEach(value -> System.out.println(value));
System.out.println("int 난수 출력");
IntStream is = random.ints(5);
is.forEach(value -> System.out.println(value));
2. 하나의 난수 생성
protected int next(int bits)
public boolean nextBoolean()
public double nextDouble()
public float nextFloat()
public double nextGaussian()
public long nextLong()
public int nextInt(int bound)
public void nextBytes(byte[] bytes)
보다시피 많은 종류의 난수 생성 메소드가 있으며, 호출 시 메소드명에 포함된 자료형의 난수를 반환해준다.
또한, nextInt()의 경우는 parameter에 정수값을 넘길 수 있다. 이렇게 하면 0과 지정된 값 사이에 있는 난수를 반환해준다.
ex)
Random random = new Random();
boolean b = random.nextBoolean();
System.out.println("random boolean : " + b);
double d = random.nextDouble();
System.out.println("random double : " + d);
int i = random.nextInt();
System.out.println("random int : " + i);
int iHasRange = random.nextInt(10);
System.out.println("random int(range 10) : " + iHasRange);
메소드를 사용해서 난수 하나를 생성할 수 있다.
정리
Math.random() 메소드와 java.util.Random 클래스에 대해 알아보았다.
Math.random() 또한 내부적으로는 Random 클래스를 사용한다.
간단하고 간편하게 난수를 생성하려면 Math.random()을, 더 효율적으로 원하는 난수를 생성하고자 한다면 Random 클래스를 사용하는 게 좋은 것 같다.
- 참고자료
docs.oracle.com/javase/8/docs/api/java/lang/Math.html#random--
docs.oracle.com/javase/8/docs/api/java/util/Random.html#doubles--