본문 바로가기
Java/Java

난수란?, Random 클래스, Math.random

by 박채니 2022. 3. 3.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


난수란?

정해진 범위 내에서 무작위로 추출된 수를 말합니다.

 

자바에서 난수를 생성하는 방법은 크게 두가지가 있습니다.

 

① java.util.Random 활용

java.util 패키지에 있는 Random 클래스를 활용합니다.

단! 다른 패키지 내의 클래스를 사용하는 것이므로 반드시 import가 필요하겠죠?

 

public void test1() {
	Random rnd = new Random();
		
	int a = rnd.nextInt();
	System.out.println(a);
		
	long b = rnd.nextLong();
	System.out.println(b);
}

@콘솔출력값
395785818
-1297663030753196936

-1982793233
6452393816866212613

Random클래스의 .next계열 메소드를 사용하여 랜덤 값을 불러옵니다.

각 타입별로 메소드가 지정 되어 있으며, 해당 범위 내에서 랜덤 값을 뽑습니다.

따라서 int는 -21억 ~ 21억까지의 수를, long은 약 -900경 ~ 900경의 수 중에서 랜덤으로 뽑는 것이죠.

 

0 ~ 9까지의 수를 추출하고 싶다면?

// nextInt(경우의 수)
int num = rnd.nextInt(10);	// 0~9까지 10가지 수 추출
System.out.println(num);

@콘솔출력값
8

nextInt(int bound) 메소드를 사용하여 원하는 경우의 수만큼 ( ~ ) 안에 입력해줍니다.

 

0 ~ 9까지의 10가지 수 중에서 랜덤 값을 추출하였으며, 실행 할 때마다 값은 변경됩니다.

(컴퓨터는 0부터 시작하므로 0~9까지 추출)

 

1 ~ 10까지의 수를 추출하고 싶다면?

// nextInt(경우의 수) + 최소 값 : 최소 값 ~ 경우의 수
int num = rnd.nextInt(10) + 1;	// 1~10까지 10가지 수 추출
System.out.println(num);

@콘솔출력값
1

최소 값을 지정해주면 최소 값 ~ 경우의 수까지의 수를 추출합니다.

 

// 50~100까지의 수 추출
num = rnd.nextInt(51) + 50;	// 50~100까지 50가지 수 추출
System.out.println(num);
		
// 0.0이상 ~ 1.0미만 까지의 수 추출
double dnum = rnd.nextDouble();
System.out.println(dnum);
		
// boolean - true/false 중 임의 리턴
boolean bool = rnd.nextBoolean();
System.out.println(bool);

@콘솔출력값
77
0.8559772185337099
false

 

② java.lang.Math.random() 활용

☞ java.lang 패키지는 너~~무 자주 쓰이기 때문에 유일하게 import가 필요 없습니다. (JVM이 내부적으로 알아서 해줌)

(System. 도 java.lang 패키지)

 

public void test2() {
	double num = Math.random();
	System.out.println(num);	//0.0이상 ~ 1.0미만 수
}

@콘솔출력값
0.023067796845727573

import가 필요 없다는 것은 객체 생성을 별도로 안해줘도 된다는 것이기 때문에 바로 Math.random()을 num에 대입해주었습니다.

단!!! Math.random()은 double로 리턴하므로 0.0이상 ~ 1.0미만의 수를 리턴해줍니다.

 

정수로 변환하여 0 ~ 10까지 출력하고 싶다면?

// Math.random() * 경우의 수
System.out.println((int)(Math.random()*10));

@콘솔출력값
1

원하는 경우의 수만큼 ( * 경우의 수) 해줍니다.

(0.0234... 추출되기 때문에 *10을 하면 소수점이 뒤로 이동하고, (int)로 형변환을 하여 소수점을 버립니다.)

 

1 ~ 10까지 출력하고 싶다면?

// (Math.random() * 경우의 수) + 최소값
System.out.println((int)(Math.random() * 10) + 1);

@콘솔출력값
8

마찬가지로 + 최소값을 해주어 범위를 지정해줍니다. (1 ~ 10 중에서 추출)

 

boolean bool = (int)(Math.random()*2) == 0;
System.out.println(bool);

@콘솔출력값
false

boolean도 0~1까지 수를 지정하여 0이면 true 1이면 false가 리턴되게끔 하였습니다.


동전게임 만들기

- 사용자 : 앞/뒤 베팅

- 컴퓨터 : 난수 생성 후 사용자 값과 비교 → 같으면 사용자 승, 다르면 컴퓨터 승

public void test3() {
	Scanner sc = new Scanner(System.in);
	Random ran = new Random();
		
	System.out.print("> 동전 앞/뒤를 입력하세요(앞:1 뒤:2) : ");
	int user = sc.nextInt();
		
	//Math.random()
	boolean com = (int)(Math.random()*2) + 1 == user;
	String str = com ? "당신이 이겼습니다!" : "당신이 졌습니다.";
	System.out.println(str);
		
	
	//Random
//	boolean com1 = ran.nextInt(2) == user;
//	String str1 = com1 ? "당신이 이겼습니다!" : "당신이 졌습니다.";
//	System.out.println(str1);
}

@콘솔출력값
> 동전 앞/뒤를 입력하세요(앞:1 뒤:2) : 1
당신이 이겼습니다!