랜덤 문자 생성 - laendeom munja saengseong

2021.04.24 - [이미지맥스, lua/루아 lua] - [lua] 루아에서 랜덤한 문자열을 생성하기

앞서 랜덤한 문자열을 정해진 규칙에 따라 생성해보았습니다. 가령 문자 10자 + 숫자 3자 같은 방법으로 말이죠.

이에 문자열 자동 생성을 보다 더 랜덤한 규칙으로 생성하고 싶어졌습니다.

대문자, 소문자, 숫자 캐릭터를 생성하는 부분을 각각 함수화 하고 이 함수를 랜덤으로 실행하는 방법을 통해 랜덤한 문자가 포함된 테이블을 생성합니다.

이렇게 생성한 테이블에 저장된 문자(캐릭터)들을 조합하여 문자열(스트링)으로 만들어주면 완료입니다!

방법1. 테이블을 사용하여 문자열 합성 (대문자, 소문자, 숫자를 생성하는 개별 함수)

-- Make Random String -- 대문자 생성 function makeChar1(charsTable) local char = string.char(math.random(0x41, 0x5A)) table.insert(charsTable, char) end -- 소문자 생성 function makeChar2(charsTable) local char = string.char(math.random(0x61, 0x7A)) table.insert(charsTable, char) end -- 숫자 생성 function makeNum(charsTable) local char = string.char(math.random(0x30, 0x39)) table.insert(charsTable, char) end -- 문자열 합성 function combineString(charsTable) local combine = '' for i = 1, #charsTable, 1 do combine = combine..charsTable[i] end return combine end-- sample -- 10글자의 랜덤한 문자열을 생성하는 경우 randomChars = {} for i = 1, 10, 1 do make_what = math.random(1,3) if make_what == 1 then makeChar1(randomChars) elseif make_what == 2 then makeChar2(randomChars) elseif make_what == 3 then makeNum(randomChars) end end newString = combineString(randomChars) print(newString) -- > HqAsc1a32q (실행할 때마다 10글자의 랜덤한 문자열이 출력)

방법2. 테이블을 사용하여 문자열 합성 (대문자, 소문자, 숫자를 생성하는 함수를 통합)

-- Make Random String Functions -- 문자 생성 function makeChar(charsTable) make_what = math.random(1,3) local char if make_what == 1 then char = string.char(math.random(0x41, 0x5A)) elseif make_what == 2 then char = string.char(math.random(0x61, 0x7A)) elseif make_what == 3 then char = string.char(math.random(0x30, 0x39)) end table.insert(charsTable, char) end -- 문자열 합성 function combineString(charsTable) local combine = '' for i = 1, #charsTable, 1 do combine = combine..charsTable[i] end return combine end-- sample -- 10글자의 랜덤한 문자열을 생성하는 경우 randomChars = {} for i = 1, 10, 1 do makeChar(randomChars) end newString = combineString(randomChars) print(newString) -- > fAceG5LFs2 (실행할 때마다 10글자의 랜덤한 문자열이 출력)

방법3. 지정한 갯수 만큼 문자를 랜덤 생성하여 합성후 반환하는 함수 (추천)

앞서 랜덤한 캐릭터 글자를 생성하는 함수와 이를 테이블에 저장후 스트링 문자열로 조합하는 함수를 만들었습니다.

그러면 원하는 기능 구현은 다 되었으니 이제 좀더 편하게 랜덤한 문자열을 생성해야할 차례입니다.

랜덤한 문자를 생성하는 함수와 문자를 합성하는 기능의 함수를 만들고,

생성할 글자 개수를 지정하면 랜덤한 문자열이 생성될수 있게끔 할 것입니다.

기존에 만들어두었던 생성함수와 조합함수를 활용하면 금방 만들수 있겠네요.

-- 랜덤 문자(캐릭터) 생성 function makeChar() local new_char local make_what = math.random(1, 3) if make_what == 1 then -- 대문자 A-Z 생성 new_char = string.char(math.random(0x41, 0x5A)) elseif make_what == 2 then -- 소문자 a-z 생성 new_char = string.char(math.random(0x61, 0x7A)) elseif make_what == 3 then -- 숫자 0-9 생성 new_char = string.char(math.random(0x30, 0x39)) end return new_char end -- 랜덤 문자열(스트링) 생성 function makeString(char_amount) local new_string = '' if char_amount > 0 then for i = 1, char_amount, 1 do new_string = new_string..makeChar() end return new_string else print('argument must type more then 0') end end -- >> 인수 : 생성할 글자 갯수-- sample -- 10글자의 랜덤한 문자열을 생성하는 경우 new_string = makeString(10) print(new_string) -- > Y8Mw5RYzt9 (실행할 때마다 10글자의 랜덤한 문자열이 출력)

위와 같이 함수를 정의 한뒤 실제 코드에서는 makeString() 문자열 함수 만 사용하면 되겠습니다.

이미지맥스에서 이렇게 생성한 문자열을 키보드입력함수 Keybd() 를 이용하여 타이핑하신다면 금상첨화입니다.

간편합니다.

랜덤하게 아이디를 대량으로 생성해서 DB에 insert할 일이 생겼다.

어떻게 할 것인가?

엑셀로 생성해보자!!

생각보다 매우 간단했다.

셀에 아래와 같이 써 주면 되는 것이다.

A ~ Z까지 랜덤하게 생성하고 싶으면 셀 안에 =CHAR(RANDBETWEEN(65,90)) 이케 쓰면 된다. 

이러면 1개의 알파벳이 랜덤하게 생성된다. 이 때 몇 개 더 붙여 쓰고 싶다면..

=CHAR(RANDBETWEEN(65,90)) & CHAR(RANDBETWEEN(65,90)) & CHAR(RANDBETWEEN(65,90)) 

이런 식으로 쭉쭉 나열해주면 된다. 엄청 쉽다. 그러고 나서 쭉~~ 드래그 해주면 무수히 많은 아이디가 생성된다.

만약 대문자 아니고 소문자를 원한다면.. 숫자를 97~122로 바꾸면 된다.

끝.

간단하게 랜덤 문자열 만들기

자바스크립트에서 임의의 문자열을 생성하는 방법은 여러 가지가 있습니다. 가장 빠른 방법은 Math.random() 메소드를 사용하는 것 입니다.

Math.random() 메소드는 0(이상)과 1(미만) 사이의 난수를 반환합니다. 이 난수를 문자열로 변환한 후 소수점 표시를 제거하면 됩니다.

const rand = Math.random().toString().substr(2, 8);

위의 예제는 8개의 숫자로 된 랜덤 문자열을 만들어 냅니다.

영숫자 문자열을 생성하려면 2에서 36 사이의 값을 toString() 메소드의 매개변수인 radix로 넘기면 됩니다. 이는 결과 값의 진법을 정의하는 것 입니다. 이진수 문자열(0~1)을 얻으려면 toString() 메소드의 radix에 2를 넣으면 됩니다.

const binary = Math.random().toString(2).substr(2, 8);

여기서 알파벳이 섞인 랜덤 문자열을 얻으려면 toString() 메소드의 매개변수인 radix에 16 이나 이보다 큰 값을 넣으면 됩니다.

const rand = Math.random().toString(16).substr(2, 8);

이제 위의 코드를 활용해 원하는 글자 수를 입력하면 랜덤 문자열을 리턴하는 함수를 만들어 보겠습니다.

const random = (length = 8) => { return Math.random().toString(16).substr(2, length); }; console.log(random()); console.log(random(6)); console.log(random(10)); console.log(random(14));

긴 랜덤 문자열 생성하기

14 글자 이상의 긴 랜덤 문자열을 생성하기 위해서는 자신만의 랜덤 문자열 생성기를 만들어야 합니다. 다음의 예제는 'A~Z', 'a~z, '0~9' 중 하나를 랜덤하게 선택해 문자열을 만드는 것을 보여줍니다.

const random = (length = 8) => { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let str = ''; for (let i = 0; i < length; i++) { str += chars.charAt(Math.floor(Math.random() * chars.length)); } return str; }; console.log(random()); console.log(random(12)); console.log(random(20));

위 예제에서는 Math.random() 메소드와 Math.floor() 메소드를 사용해 랜덤한 문자열의 인덱스를 생성해 주어진 문자열에서 랜덤으로 문자를 선택하게 했습니다. 또한 for loop를 사용해 랜덤으로 선택된 문자를 문자열로 만들도록 작성되었습니다.

관련 글

숫자 반올림, 올림, 내림

랜덤 숫자 생성하기

forEach, map, filter, find

forEach 루프

Toplist

최신 우편물

태그