해나아부지 개발일지

Math.Random()을 이용한 임의의 정수, 문자열 리턴하기 본문

Developers/JavaScript

Math.Random()을 이용한 임의의 정수, 문자열 리턴하기

__APPA 2020. 5. 5. 22:45

Math.random()은 0~1 사이의 임의의 수를 반환하는 메서드이다.

developer console에 찍어보시라

특정 범위에 랜덤한 숫자를 생성하고 싶다면 Math.floor( Math.random() * 범위의 최대값 ) 를 해주면 된다.

주사위 굴리기를 생각해보면 1부터 6까지의 숫자가 필요하다.

 Math.floor( Math.random() * 7 )

Math.random()은 0과 1사이의 수를 생성하기 때문에 0.1 이하의 숫자가 생성이 된다면 Math.floor()로 소수점 이하가 버려지면 어떠한

숫자를 곱해도 0을 return한다. 그러므로 0 return 하지 않으려면 최대값 - 1을 해주고 최소값을 더해주면 된다.

Math.floor( Math.Random() * 6 ) + 1 

해서 1부터 6까지의 임의의 수를 생성할 수 있다!

 

이제 두 숫자를 입력 받아 그 사이의 임의의 숫자를 반환하는 함수를 살펴보자.

MDN에 친절하게도 예제를 통해서 알려주고 있다.

// 두 수 사이의 임의의 정수 구하기
function getRandomInt(min, max) {
  min = Math.ceil(min); //올림
  max = Math.floor(max); //내림
  return Math.floor(Math.random() * (max - min)) + min; // 최대값은 제외, 최소값은 포함
}

1. 두 개의 수를 입력 받아 min(최소값)은 올리고 max(최대값)은 내려서 저장해준다. (변수를 최소화)

 - 소수점을 가진 수가 들어왔을 경우 min = 55.2 -> 56, max = 88.888 -> 88

2. max와 min 사이의 수를 구해야하니 Math.random에 max - min 값을 곱해준다.

3. Math.floor로 소수점 이하는 버린 뒤 min을 더해주면 최소값과 최대값 사이의 임의의 정수가 return된다.

 

응용력 ↑

이제 랜덤한 문자열을 생성해 보자!

stackoverflow에서 힘들게 짠 코드를 보았다 ㅠㅠ

function makeid(length) {
   var result           = '';
   var characters       = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
   var charactersLength = characters.length;
   for ( var i = 0; i < length; i++ ) {
      result += characters.charAt(Math.floor(Math.random() * charactersLength));
   }
   return result;
}

console.log(makeid(5));

characters에 일일이 문자를 입력하다니... 알려주고 싶다

 

우리에겐 ASCII Table가 있습니다. 

컴퓨터는 0과 1밖에 모르는 멍청이..(?) 입니다. 그래서 문자도 숫자로 기억을 해야 합니다. 

아스키 코드(ASCII Table)는 0번부터 127번까지만 사용합니다. 127번 이후 코드를 사용했던 적도 있었는데 이는 표준이 아니며 운영체제마다 다른 코드(문자)를 배치했기 때문에 호환이 되지 않습니다. 윈도우즈 운영체제는 현재 128번부터 255번 사이에 포함된 문자를 출력하려는 시도에 대해 물음표(?)를 출력해서 사용하면 안된다는 것을 알려줍니다. 128번과 255번 문자는 물음표는 아니지만 사용할 수 없는 문자입니다.  오뇽님 블로그에서 참고

아스키 코드표에

1. 숫자 0~9는 80~89

2. 소문자 a~z는 97~122

3. 대문자 A~Z는 65~90

임을 알 수 있습니다.

 

function getGUID(length){
//97-122 사이에 랜덤한 정수 만들기
let result = '';
for(let i =0; i < length; i++){
  result += String.fromCharCode(getRandomInt(97,122))
}
//아스키 문자를 이용하여 문자로 반화
  return result;
}
undefined

10개의 임의의 문자를 생성하는 함수

 

앞서 보았던 두 수 사이의 임의의 값을 구하는 getRandomInt()를 이용하여 97과 122사이의 임의의 숫자를 생성하고 String.fromCharCode()에 넣어주면 아스키 코드표에서 해당 숫자에 해당하는 문자열 불러옵니다.

반복문이 입력받은 숫자만큼 반복하면서 result에 임의의 문자열이 하나씩 저장됩니다.

 

임의의 숫자 임의의 문자열을 구해보았는데.. 그렇다면 임의의 숫자와 문자열을 반환하는 함수는요!?

 

1. 0과 1을 랜덤하게 생성시키고 

2. 0이 나오면 숫자를, 1이 나오면 문자를 result에 넣어주면 된다.

function getRandomStringPlusNumber(length){
let result = '';
for(let i =0; i < length; i++){
  let randomNum = getRandomInt(-1,2);
  if(randomNum === 0){
    result += String.fromCharCode(getRandomInt(48,57))
  }else{
    result += String.fromCharCode(getRandomInt(97,122))
  }
}
  return result;
}

OTP나 자동가입 방지 문자 생성 등 다양하게 쓸 수 있는 기능을 구현해보았습니다. 

'Developers > JavaScript' 카테고리의 다른 글

클로저, 람다  (0) 2020.05.21
Scope in Javascript  (0) 2020.05.16
map vs filter vs reduce  (0) 2020.04.29
Mutable vs Immutable  (0) 2020.04.28
알쓸신잡(1)  (0) 2020.04.28
Comments