Math.random()
- 난수(임의의 수) 발생을 위한 메서드
- 0.0 <= x <= 1.0 범위의 double 타입 난수 발생
난수 발생 기본 공식
1. (정수화)(Math.random() * 상한값) : 0 ~ 상한값 -1 (0<=x<1)
2. (정수화)(Math.random() * 상한값) +1 : 1 ~ 상한값 (0<=x<상한값)
for(int i=1;i<=10;i++) {
// 정수 1자리 범위(0~9) 난수 발생시키기 위해서는 소수점 첫째자리 숫자를 정수 위치로
// 이동시키고 남은 소수점 이하 숫자들은 제거를 위해 정수화
System.out.println((int)(Math.random()*10)); // 0 <= x <10
// 만약, 0을 제외하고 1부터 특정상한값까지의 난수 발생을 위해서 난수 발생 결과에 +1 수행
System.out.println((int)(Math.random()*10)+1); // 1 <= x <11 || 1 <=x<=10 (1~10 사이의 난수)
}
// 연습) 1~20 사이의 난수 발생
System.out.println((int)(Math.random()*20)+1); // 1 <= x <11 || 1 <=x<=10 (1~10 사이의 난수)
java.util 패키지
- 다양한 기능을 제공하는 유틸리티 클래스들의 모음
- 난수 생성, 날짜 및 시각 관리, 자료구조 등
Random 클래스
- 난수 발생 기능 전용 클래스
- static 메서드가 아닌 일반 메서드 형태로 제공하므로 인스턴스 생성 필수
- 정수뿐만 아니라 다양한 타입의 난수 제공
➡️ nextXXX() 메서드를 호출하여 각 기본 데이터타입 난수 발생
➡️ 특히, nextInt() 메서드를 통해 정수화 과정 없이 정수형 난수 발생
Random 클래스의 인스턴스 생성
Random r = new Random();
for(int i=1;i<=10;i++) {
System.out.println("int형 범위의 난수 : "+r.nextInt()); // int형 범위(-21억~21억)
System.out.println();
//nextDouble() 메서드 : double형 범위 난수 발생
// => Math.random() 메서드와 동일한 결과
System.out.println("double형 범위의 난수 : "+r.nextDouble());
System.out.println();
//nextBoolean() 메서드 : true 또는 false 난수 발생
System.out.println("boolean형 범위의 난수 : "+r.nextBoolean());
System.out.println();
//nextInt(int) 메서드를 활용하여 원하는 범위의 난수 발생
// => 파라미터로 최대값(x) 전달시 : 0~x-1 범위의 난수 발생
System.out.println("0~9 사이의 난수 : "+r.nextInt(10));
//1~최대값(x) 사이의 난수 발생을 위해서는 nextInt(x) +1 필요
System.out.println("1~10 사이의 난수 : "+(r.nextInt(10)+1));
}
난수 발생 방법 2가지
1. Math.random() 메서드를 통해 double 타입 난수 발생시키는 방법
2. Random 클래스 인스턴스 생성 후 nextXXX() 메서드를 통해 각각의 타입에 대한 난수 발생시키는 방법
난수를 활용하여 특정 범위의 값을 발생시키기 - SMS 인증번호(숫자) 생성
➡️Random 객체의 nextInt(int) 메서드 활용하여 특정 범위에 해당하는 정수형 난수 발생시킴
4자리 인증번호 생성
Random r = new Random();
for(int i=1;i<=10;i++ ) {
//nextInt(int) 메서드는 0~x-1까지 난수 발생시킴
int rNum = r.nextInt(10000);
String strNum=String.format("%04d", rNum);
System.out.println(strNum);
}
6자리 인증번호 생성
for(int i=1;i<=10;i++ ) {
//nextInt(int) 메서드는 0~x-1까지 난수 발생시킴
int rNum = r.nextInt(1000000); // 0~999999 사이의 난수 발생
String strNum=String.format("%06d", rNum);
System.out.println(strNum);
}
난수를 활용하여 특정 범위의 값을 발생시키기 E-mail 인증코드(문자)생성
1. 인증코드에 사용될 문자를 배열로 모두 저장하기
char[] codeTable = {'A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','t','d','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9','!','@','$'};
Random r2 = new Random();
String code = "";
int codeLength = 20;
// 원하는 코드길이만큼 for문으로 반복문 처리
for(int i=1;i<=codeLength;i++) {
// 배열 크기를 난수의 범위로 지정하여 난수 발생
int index = r2.nextInt(codeTable.length);
// 생성된 난수를 배열 인덱스로 활용하여 1개의 코드를 가져와서 문자열 결합
code += codeTable[index];
}
System.out.println("인증코드 : " + code);
➡️ 결과 :
인증코드 : !K2cyeJJ1XODekiShxe2
'JAVA' 카테고리의 다른 글
[JAVA] java.time 패키지 (0) | 2023.10.25 |
---|---|
[JAVA] 날짜 및 시각 관련 클래스를 알아보자 (0) | 2023.10.25 |
[JAVA] java.lang.Math 클래스 (0) | 2023.10.24 |
[JAVA] 패스워드 복잡도 검사 코드짜기 (0) | 2023.10.24 |
[JAVA] Wrapper 클래스 예제 (0) | 2023.10.24 |