자바에서 랜덤 숫자를 생성하는 방법은 2가지가 있다.
1. Math 클래스의 Math.random()
2. Random 클래스
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
컴퓨터는 동일한 상태값이 들어오면 언제나 동일한 값을 출력하기 때문에 사실은 난수를 생성할 수 없다.
그래서 Seed를 생성하여 그 시드에 맞는 난수를 결정하게 한다. 즉, 컴퓨터의 난수는 seed에 따라 동일하게 나오는 hash값과 유사하다.
랜덤클래스를 사용하기 위해서는 java.util.Random을 import해야한다.
Random클래스의 nextInt()메소드에 매개변수를 입력하면 0 부터 입력한 정수 미만의 랜덤한 정수를 반환한다.
매개변수를 입력하지 않으면 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
*/
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 만 생성된다.
*/