JAVA 공부 (DAY 6)

hmLee·2021년 11월 24일
0

자바 기초

목록 보기
5/6

자바에서 랜덤 숫자를 생성하는 방법은 2가지가 있다.
1. Math 클래스의 Math.random()
2. Random 클래스

Math.random()

  • 0 ~ 1 사이의 랜덤 숫자를 생성하는 함수로 java.lang 에 있기 때문에 따로 import를 하지 않아도 된다.
  • 리턴값의 타입은 double이다.
  • 0 ~ 99까지의 정수: (int)(Math.random()*100)
  • 1 ~ 100까지의 정수: (int)(Math.random()*100) + 1
  • 각 수마다 나오는 확률이 균일하지는 않다.
public class Ex01_Random {
	//주사위 100 번 굴리기
	public static void main(String[] args) {
		for(int i = 1; i <= 100; i += 1) {
			System.out.print(i +" 번째 주사위 숫자는 ");
			System.out.println((int)(Math.random()*6)+1);
		}
	}
}
//1~6사이의 숫자를 무작위로 100번 추출하기이므로
//Math.random()에 6을 곱하고 1을 더해줬다.
//(Math.random() * 6) + 1
//그리고 소수점 아래 숫자들을 다 날리기 위해 int로 캐스팅 해주었다.
//(int)(Math.random()*6)+1

Random 클래스

  • 컴퓨터는 동일한 상태값이 들어오면 언제나 동일한 값을 출력하기 때문에 사실은 난수를 생성할 수 없다.

  • 그래서 Seed를 생성하여 그 시드에 맞는 난수를 결정하게 한다. 즉, 컴퓨터의 난수는 seed에 따라 동일하게 나오는 hash값과 유사하다.

  • 랜덤클래스를 사용하기 위해서는 java.util.Random을 import해야한다.

  • Random클래스의 nextInt()메소드에 매개변수를 입력하면 0 부터 입력한 정수 미만의 랜덤한 정수를 반환한다.

    • ex) nextInt(10) > 0~9까지의 랜덤 숫자
  • 매개변수를 입력하지 않으면 int형 표현범위 -2147483648 ~ 2147483648 의 값을 반환한다.

import java.util.Random;

public class EX02_Random_class {

	public static void main(String[] args) {
		Random random = new Random();
		//random.setSeed(System.currentTimeMillis());
               	//밀리세컨즈(1/1000초)보다 더 큰 범위를 잡기 위해
        	//억분의1초(1/10^-9)인 나노세컨즈로 매개변수를 지정했다.
           	//Seed를 더 큰 표본으로 직접 지정해 균등하게 랜덤 숫자가 뽑힐 수 있게 함.
		random.setSeed(System.nanoTime());

		//nextInt()메소드 안에 매개변수를 입력하지 않은 경우
		for (int i = 1 ; i <= 5; i += 1) {
			System.out.println(random.nextInt());
		}
		System.out.println(" ");
        
        	//nextInt()메소드 안에 매개변수를 입력한 경우
		final int MAX = 6;
		
		for (int i = 1; i <= 30; i+= 1) {
			int dice = random.nextInt(MAX + 1);
			System.out.print(dice + " ");
		}
		
	}
}

/* console
1719252564
506327431
1360058647
-1471029925
-1191751654
 
0 6 5 5 4 3 4 5 5 4 5 1 5 2 4 1 5 0 5 6 2 0 4 0 1 0 5 6 3 5 
*/
  • seed값을 지정하지 않으면 컴퓨터는 현재 시간을 seed값으로 갖는다. (시간은 계속 변하기 때문)
  • seed값을 지정하면 항상 같은 값을 반환한다.
import java.util.Random;

public class Random_class_test {
	//1~10까지의 값을 5회 랜덤 추출
	public static void main(String[] args) {
		Random rnd = new Random();
		
		for(int i = 1 ; i <= 5 ; i += 1) {
			System.out.print(rnd.nextInt(10)+1 + " ");
		}
		System.out.println(" ");
		
		rnd.setSeed(10); //시드값을 10으로 지정
		
		for(int i = 1 ; i <= 5 ; i += 1) {
			System.out.print(rnd.nextInt(10)+1  + " ");
		}
	}
}

/*
4 2 5 6 3  <-시드값을 지정하기 전의 난수는 계속 바뀌지만
4 1 4 1 7  <-시드값을 지정하고나서는 4 1 4 1 7 만 생성된다.
*/
profile
정말 개발자가 될 수 있을까?

0개의 댓글