파이널 프로젝트로 네이버 로그인을 구현 하던 중 16자리의 난수 생성이 필요 했다. 난수를 생성하는건 여러 방법이 있어 그 중에 두가지 방법을 소개 해보려고 한당
[Java]
Random random = new Random();
String key = "";
for (int i = 0; i < 3; i++) {
int index = random.nextInt(26) + 65;
key += (char) index;
}
for (int i = 0; i < 6; i++) {
int numIndex = random.nextInt(10);
key += numIndex;
}
Random random = new Random()
Random 클래스의 인스턴스를 생성하여 난수를 생성하기 위한 객체를 만든다. 이 객체를 통해 난수를 생성하게 된다.
String key = "";
key를 빈 문자열로 초기한다.
for (int i = 0; i < 3; i++) {
3번의 for 문을 돌린다.
int index = random.nextInt(26) + 65;
random.nextInt() 은 Java에서 제공하는 메서드로, java.util.Random 클래스의 인스턴스인 random을 통해 난수를 생성하는 기능을 수행한다. 이 메서드는 정수형의 난수를 생성하는데 사용 된다.
내가 짠 코드의 random.nextInt(26)은 0 이상 26 미만의 랜덤한 정수를 생성한다. 그리고 여기에 65를 더하면 65 이상 91 미만의 랜덤한 정수가 된다. 그리고 이 숫자는 알파벳 대문자의 아스키 코드 값에 해당 한다.
key += (char) index; }
index에 해당하는 아스키 코드 값을 문자로 변환하여 key 변수에 추가한다. 따라서 key에는 알파벳 대문자로 이루어진 세 자리 문자열이 추가된다
for (int i = 0; i < 6; i++) {
이제 또 다른 6번 반복되는 루프를 돌린다. 이 루프에서는 숫자로 이루어진 랜덤한 인증번호의 나머지 여섯 자리를 생성하게 된다.
int numIndex = random.nextInt(10);
0부터 9까지의 랜덤한 숫자를 얻기 위해 random.nextInt(10)를 실행 한다.
key += numIndex; }
그리고 numIndex 값을 key 변수에 추가하게 된다. 따라서 key에는 숫자로 이루어진 여섯 자리 문자열이 추가되며 for 문을 빠져 나온다.
그러면 최종적으로 문자 3개와 숫자 6개로 이루어진 난수가 생성되게 된다!
[JavaScript]
generateRandomState() {
const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let state = "";
for (let i = 0; i < 16; i++) {
const randomIndex = Math.floor(Math.random() * characters.length);
state += characters.charAt(randomIndex);
}
return state;
}
}
16개의 랜덤 문자로 이루어진 state를 생성하려고 정의한 것이다.
const characters = "~~~~";
대소문자 알파벳과 숫자 모두 사용한다.
let state = "";
state 값을 초기화 한다.
for (let i = 0; i < 16; i++) {
16번의 for문을 돌려서 난수를 생성한다.
const randomIndex = Math.floor(Math.random() * characters.length);
randomIndex 는 자바스크립트의 내장 함수인 Math.floor 와 Math.random을 이용하게 된다.
Math.floor는 주어진 숫자를 소수점 이하를 버리고 가장 가까운 정수로 내림하는 역할이고 Math.random은 0 이상 1 미만의 임의의 부동소수점 숫자를 생성하는 함수이다.
예시를 살짝 들면 Math.floor(3.6)는 3을 반환 하고 Math.random은 0.513 이나 0.0972 같은 0과 1사이의 소수를 생성한다.
그래서 결국 (Math.random() * characters.length) 는 0 이상 characters의 길이만큼의 1보다 작은 랜덤 수를 생성한다.
ex)
Math.random()이 0.5라면, Math.random() * 62는 31이라 Math.floor(31)은 31을 반환한다.
Math.random()이 0.999라면, Math.random() * 62는 약 61.938이라 Math.floor(61.938)은 61을 반환하게 되고
Math.random()이 0.001이라면, Math.random() * 62는 약 0.062 로 Math.floor(0.062)은 0을 반환한다.
state += characters.charAt(randomIndex);
characters.charAt(randomIndex)를 사용하여 해당 인덱스에 해당하는 문자를 가져와 state 변수에 추가한다. 이렇게 16번 반복하면 state 변수에는 길이가 16인 랜덤 문자열이 저장되게 된다~~
'알고리즘' 카테고리의 다른 글
백준 11945 뜨거운 붕어빵 (feat.런타임 에러) (0) | 2024.11.18 |
---|---|
백준 2752 세수정렬 과거의 코드랑 비교하기 (1) | 2024.11.13 |
백준 5543 상근날드 1년전 코드랑 비교하기 (0) | 2024.11.07 |
Merge Strings Alternately (0) | 2023.09.10 |
백준 2798번 블랙잭 (0) | 2023.05.21 |