Java Category/Java

[Java] 랜덤 숫자(난수) 얻기

ReBugs 2023. 7. 30.

이 게시글은 이것이 자바다(저자 : 신용권, 임경균)의 책과 동영상 강의를 참고하여 개인적으로 정리하는 글임을 알립니다. 


math 클래스의 random() 메소드 이용

0.0과 1.0 사이(0.0 포함, 1.0 미포함) 범위에 속하는 하나의 double 타입의 값을 리턴

double v11 = Math.random(); //0.47464615326686044

 

1부터 n까지 랜덤 수를 뽑는 코드는 아래와 같다.

 

int num = (int) (Math.random()*n) + 1;

 

아래의 예제는 1~45의 랜덤 숫자 중 6개 뽑는 예제이다.

public class Main {
	public static void main(String[] args) {
		for(int i = 0; i < 6; ++i) 
		{
			int num = (int) (Math.random()*45) + 1;
			System.out.print(num + " ");
		}
	}
}
/*
38 45 9 7 40 37
*/

 


 

java.util.random 클래스 이용

객체 생성 설명
Random() 현재 시간을 이용해서 종자값을 자동 설정
Random(long seed) 주어진 종자값을 사용
  • 종자값(seed)이란 난수를 만드는 알고리즘에 사용되는 값으로, 종자값이 같으면 같은 난수를 얻는다.
    종자값이 다른데 같은 난수를 얻는 확률은 매우 드물다.
  • 아래의 표는 Random 클래스가 제공하는 메소드이다.
리턴값 메소드 설명
boolean nextBoolean() boolean 타입의 난수를 리턴
double nextDouble() double 타입의 난수를 리턴(0.0 <= ~ < 1.0)
int nextInt() int 타입의 난수를 리턴(-2^32 <= ~ <= 2^32 -1)
int nextInt(int n) int 타입의 난수를 리턴(0 <= ~ < n)

 

진짜 난수, 의사 난수
로또에서 번호가 적힌 공을 하나하나 꺼내 당첨 번호를 결정하는 것과 같은 것이 '진짜 난수'를 생성하는 과정이다.
의사 난수는 실제와 비슷하다는 뜻이다.
컴퓨터가 생성하는 난수는 진짜 난수가 아니라 의사 난수이다.

그럼 Random 클래스가 생성하는 난수는 뭔데?
컴퓨터 과학에서 난수는 보통 특정 입력값이나 컴퓨터 환경에 따라 무작위로 선택한 것처럼 보이는 난수를 생성한다.
Random 클래스에서는 48비트의 seed를 사용하고, 이 seed는 선형 합동법이라는 계산법에 의해 특정 수(난수)로 바뀐다.
seed의 값과 컴퓨터 환경이 같다면 그 결과값은 항상 같다.
따라서 seed를 매번 바꿔줘야한다. seed를 매번 다르게 하기 위해 현재 시간을 이용하는 것이 일반적이다. 현재 시간은 매 순간 바뀌므로 이전에 발생한 의사 난수를 다시 생성하지는 않는다.
ex) seed 가 1인 경우 : 항상 1 -> 105 -> 999 -> 1002 ... 의 순서로 숫자를 생성
ex) seed 가 2인 경우 : 항상 2 -> 892 -> 7291 -> 10123 ... 의 순서로 숫자를 생성

이는 C언어에서도 마찬가지이다.
아래의 코드는 비주얼스튜디오 환경에서 C++로 작성된 코드이다.
#include<iostream>
using namespace std;
void main()
{
	int num = rand();
	int num2 = rand();
	cout << num << ", " << num2 << endl;
}​​

위 코드로 몇 번이고 계속 실행을 해도 같은 수만 출력이 된다.

 

아래의 코드는 랜덤으로 로또 번호를 선택하고, 랜덤으로 당첨번호를 추출한다. 이후 두 로또번호가 일치하는지 확인한다.

로또는 1~45 범위의 정수 숫자만 선택할 수 있으므로 nextInt(45) + 1 연산식을 사용한다

import java.util.Arrays;
import java.util.Random;

public class RandomExample {
	public static void main(String[] args) {
		//선택번호
		int[] selectNumber = new int[6];
		Random random = new Random(3); //seed = 3
		System.out.print("선택번호: ");
		for(int i=0; i<6; i++) {
			selectNumber[i] = random.nextInt(45) + 1;
			System.out.print(selectNumber[i] + " ");
		}
		System.out.println();

		//당첨번호
		int[] winningNumber = new int[6];
		random = new Random(5); //seed = 5
		System.out.print("당첨번호: ");
		for(int i=0; i<6; i++) {
			winningNumber[i] = random.nextInt(45) + 1;
			System.out.print(winningNumber[i] + " ");
		}
		System.out.println();

		//당첨여부
		Arrays.sort(selectNumber);
		Arrays.sort(winningNumber);
		boolean result = Arrays.equals(selectNumber, winningNumber);
		System.out.print("당첨여부: ");
		if(result) {
			System.out.println("1등에 당첨되셨습니다.");
		} else {
			System.out.println("당첨되지 않았습니다.");
		}
	}
}
/*
선택번호: 15 21 16 17 34 28 
당첨번호: 18 38 45 15 22 36 
당첨여부: 당첨되지 않았습니다.
*/

'Java Category > Java' 카테고리의 다른 글

[Java] 멀티 스레드  (0) 2023.08.01
[Java] 제네릭(Generic)  (0) 2023.07.31
[Java] StringBuilder 클래스, StringTokenizer 클래스  (1) 2023.07.29
[Java] 레코드, 롬복(lombok)  (0) 2023.07.28
[JAVA] API Document  (0) 2023.07.27

댓글