안녕하세요
개발을 하다보면 확률을 이용한 프로그램을 개발할 때가 많습니다
대표적으로 로또번호 뽑기, 랜덤한 숫자를 출력하여 퀴즈를 맞추는 프로그램 등이 있습니다
이번 포스팅에서는 자바의 난수, 랜덤 숫자를 생성하는 방법에 대해서 알아보겠습니다
목차
난수(랜덤 숫자)란?
Math.random()
Random클래스
setSeed()란?
로또 번호 생성기
덧셈 퀴즈
난수(랜덤 숫자)란?
난수(亂數)란 정의된 범위 내에서 무작위로 추출된 수를 일컫는다. 난수는 누구라도 그 다음에 나올 값을 확신할 수 없어야 한다.
출처 : 위키백과
말 그대로 무작위로 나온 숫자를 의미합니다
자바에서는 난수를 구하는 방법에 대표적으로 두 가지가 있습니다
Math클래스의 random() 메서드를 사용하는 방법
Random클래스를 활용하는 방법입니다
방법에 대해서 알아보겠습니다
Math.random()
import java.io.IOException;
public class RandomExam {
public static void main(String[] args) throws IOException {
System.out.println("0 ~ 1 사이의 랜덤 숫자 : " + Math.random());
System.out.println("0 ~ 100 사이의 랜덤 숫자 : " + (int)(Math.random() * 100));
System.out.println("0 ~ 10000 사이의 랜덤 숫자 : " + (int)(Math.random() * 10000));
}
}
Math클래스의 random() 메서드를 활용하여 난수를 발생시킬 수 있습니다
random()은 double타입의 0 ~ 1까지의 실수를 랜덤으로 표시해줍니다
이것을 1 ~ 10, 1 ~ 100, 1 ~ 1000 등의 랜덤난수로 변경하려면 Math.random에 10, 100, 1000 등을 곱한 다음 (int) 형식으로 바꿔주면 됩니다
Random클래스
import java.io.IOException;
import java.util.Random;
public class RandomExam2 {
public static void main(String[] args) throws IOException {
Random random = new Random(); // 랜덤 객체 생성
random.setSeed(System.currentTimeMillis());
System.out.println("0부터 N까지 무작위 랜덤 숫자 : " + random.nextInt(100));
System.out.println("무작위 Int 값 : " + random.nextInt());
System.out.println("무작위 Long 값 : " + random.nextLong());
System.out.println("무작위 Double 값 : " + random.nextDouble());
System.out.println("무작위 Float 값 : " + random.nextFloat());
System.out.println("무작위 정규 분포의 랜덤 값 : " + random.nextGaussian());
System.out.println("true, false : " + random.nextBoolean());
}
}
Random 변수명 = new Random(); 으로 랜덤객체를 생성합니다
setSeed를 사용 랜덤객체의 시드를 선언합니다
random의 다양한 메서드를 활용하여 결과값을 출력해줍니다
메서드 | 설명 |
nextInt(int i) | 0부터 i까지의 랜덤한 숫자를 리턴합니다 |
nextInt() | Int 타입의 최소-최대범위 안에서 랜덤한 숫자를 리턴합니다 |
nextLong() | Long 타입의 최소-최대범위 안에서 랜덤한 숫자를 리턴합니다 |
nextDouble() | Double 타입의 0 - 1까지의 랜덤한 숫자를 리턴합니다 |
nextFloat() | Float 타입의 0 - 1까지의 랜덤한 숫자를 리턴합니다 |
nextGaussian | 평균이 0.0이고 표준편차가 1.0인 정규분포의 랜덤 숫자를 리턴합니다 |
nextBoolean | boolean타입의 true, false 중 랜덤한 값을 리턴합니다 |
각 메서드에 대한 설명입니다
위의 예제를 실행할 경우 결과 화면입니다
결과
setSeed()란?
위의 예제를 보면서 제일 이해가 안 되는 부분이 setSeed() 였습니다
random클래스에서 무슨 역할을 하는지 정확하게 모르겠더군요
그래서 한 번 찾아봤습니다
import java.io.IOException;
import java.util.Random;
public class RandomExam3 {
public static void main(String[] args) throws IOException {
Random random = new Random(); // 랜덤 객체 생성
random.setSeed(0);
for(int i = 0; i < 5; i++) {
System.out.print(random.nextInt(100) + " ");
}
System.out.println();
random.setSeed(0);
for(int i = 0; i < 5; i++) {
System.out.print(random.nextInt(100) + " ");
}
}
}
결과
위의 예제와 결과에서 볼 수 있듯이 setSeed를 동일하게 지정하면 난수에 대한 일정한 알고리즘이 있어 랜덤난수를 가져올때마다 규칙적으로 일정한 수를 발생시킵니다
그래서 보통 랜덤난수를 발생시키기전에 setSeed를 아래처럼 지정하여 정말로 랜덤한 난수가 나오도록 설정합니다
random.setSeed(System.currentTimeMillis());
로또 번호 생성기
import java.io.IOException;
import java.util.Random;
public class RandomExam4 {
public static void main(String[] args) throws IOException {
Random random = new Random(); // 랜덤 객체 생성
// 반복문을 사용 6개의 난수 생성
for(int i = 0; i < 6; i++) {
System.out.print("[" + (random.nextInt(45)+1) + "]");
}
}
}
난수 생성을 응용하여 로또 번호를 생성하는 간단한 프로그램을 만들어봤습니다
결과
덧셈 퀴즈
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;
public class RandomExam5 {
public static void main(String[] args) throws IOException {
Random random = new Random(); // 랜덤 객체 생성
int A = random.nextInt(100);
int B = random.nextInt(100);
System.out.print(A + " + " + B + " 정답은 ?");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int Answer = Integer.parseInt(br.readLine());
if(A + B == Answer) {
System.out.print("정답입니다");
} else {
System.out.print("오답입니다");
}
}
}
랜덤한 수 두 개를 만들어 값을 맞추는 간단한 퀴즈 프로그램을 만들어봤습니다
결과
여기까지 자바의 난수(랜덤 숫자)의 개념과 난수를 생성하는 방법, 예제를 알아봤습니다
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA] 숫자타입의 최소범위, 최대범위를 구하는 법(MAX_VALUE, MIN_VALUE) (0) | 2021.05.28 |
---|---|
[JAVA] 제곱근(루트) 구하기 Math.sqrt() 개념 및 사용법 정리 (0) | 2021.05.27 |
[JAVA] Math.abs(절대값 구하기) 사용법 정리 (0) | 2021.05.27 |
[JAVA] Math.max/min(두 인자를 비교하여 최대/최소값 구하기) 개념과 사용법 정리 (0) | 2021.05.27 |
[JAVA] 재귀함수(Recursion Function) 개념 및 예제 (0) | 2021.05.25 |