Profile picture

[Python] 난수 생성 - 랜덤한 숫자 / 문자열 / 비밀번호 만들기

JaehyoJJAng2023년 06월 06일

▶︎ 난수 만들기

난수를 만들기 위해서 string 모듈과 random 모듈을 실습해보자.


‣ random.choice

string의 digits와 random의 choice()함수를 사용하여 난수를 생성할 수 있다.

  • random.choice()
    • 문자열에서 랜덤하게 하나의 문자를 선택해준다

random.chice()를 사용하면 '0123456789'라는 문자열에서 하나의 문자열만을 선택할 수 있다.

import random

exam_string: str = '0123456789'
num = random_choice(exam_string)
print(num)

‣ string

  • string.digits
    • 숫자 0부터 9까지 문자열로 나타냄.

string 모듈을 사용하여 '0123456789'를 직접 타이핑 하지 않고 더 간단하게 할 수도 있다

import string
import random

exam_strng: str = string.digits
num = random.choice(exam_string)

‣ 난수 생성하기

위 예제를 활용하여 8자리의 임의의 난수를 발생하는 코드를 작성해보자

import string
import random

_LENGTH: int = random.randint(4,12)
exam_string: str = string.digits
result: str = ''.join(random.choices(exam_string,k=_LENGTH))
print(result)

{% include codeHeader.html name="output" %}

1175190215

▶︎ 랜덤한 문자열 만들기

  • 랜덤한 문자열을 만드는 것도 랜덤한 난수를 만드는 법과 동일하다. string.pool만 바꿔주면 된다
  • 소문자만 표현: string.ascii_lowercase
  • 대문자만 표현: string.ascii_uppercase
  • 대소문자 모두 표현: string.ascii_letters

10자리의 랜덤한 문자열을 만드는 코드를 단계별로 작성해보자


‣ 소문자 랜덤 문자열

  • string.ascii_lowercase
    • 소문자만을 포함하는 문자열 'abcdefghijklmnopqrstuvwxyz' 와 같음

소문자만을 이용한 랜덤한 문자열

import string
import random

_LENGTH: int = random.randint(4,12)
exam_string: str = string.ascii_lowercase
result: str = ''.join(random.choices(exam_string,k=_LENGTH))
print(result)

{% include codeHeader.html name="output" %}

nsjtzfz

‣ 대문자 랜덤 문자열

  • string.ascii_uppercase
    • 대문자만을 포함하는 문자열 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 와 같음

대문자만을 이용한 랜덤한 문자열

import string
import random

_LENGTH: int = random.randint(4,12)
exam_string: str = string.ascii_uppercase
result: str = ''.join(random.choices(exam_string,k=_LENGTH))
print(result)

{% include codeHeader.html name="output" %}

HVYSBNUSP

‣ 대/소문자 랜덤 문자열

  • string.ascii_leters
    • 대소문자만을 포함하는 문자열 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 와 같음

대소문자만을 이용한 랜덤한 문자열

import string
import random

_LENGTH: int = random.randint(4,12)
exam_string: str = string.ascii_letters
result: str = ''.join(random.choices(exam_string,k=_LENGTH))
print(result)

{% include codeHeader.html name="output" %}

crRYWgtdEmjx

▶︎ 랜덤한 숫자, 문자 생성

숫자가 포함된 랜덤한 숫자문자열 조합을 생성하고 싶을 때에는 아래와 같은 방법으로 코드를 작성하면 된다.

import string
import random

_LENGTH: int = random.randint(4,12)
exam_string: str = string.ascii_letters + string.digits
result: str = ''.join(random.choices(exam_string,k=_LENGTH))
print(result)

{% include codeHeader.html name="output" %}

lWAKU2sm77FB

▶︎ 랜덤한 비밀번호 생성

  • string.punctuation
    • 특수문자를 표현함. '!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~'와 같음

특수기호까지 넣고 싶다면 string.punctuation를 사용하면 된다


문자열 + 숫자 + 특수기호를 포함한 랜덤 문자열을 만들어보자

import string
import random

_LENGTH: int = random.randint(4,12)
exam_string: str = string.ascii_letters + string.digits + string.punctuation
result: str = ''.join(random.choices(exam_string,k=_LENGTH))
print(result)

{% include codeHeader.html name="output" %}

S!qz5&Q7h#T

▶︎ 프로그램 만들기

지금까지 실습한 내용들을 기반으로 랜덤 패스워드를 생성하는 프로그램을 만들어보자.

랜덤 패스워드 생성 규칙은 다음과 같다.

  • 8자리 이상
  • 대/소문자
  • 숫자, 특수문자 혼용

‣ 사용 모듈

  • random
  • sys
  • string
  • argparse

‣ 코드 작성

{% include codeHeader.html name="create_random_password.py" %}

import sys
import string
import argparse
from random import choice

def get_random_password(length: int=16) -> str:
    punctuation = r"$^+_-^&"
    return ''.join(
        choice(string.ascii_letters + string.digits + punctuation)
        for _ in range(length))
    

if __name__ == '__main__':
    parser = argparse.ArgumentParser(prog='랜덤 비밀번호', description='랜덤 비밀번호 생성기')
    try:
        parser.add_argument(
            '-c', '--count', type=int, nargs='?', const=16,
            help='Random password digits (16 by default)')
        args = parser.parse_args()
        if args.count:
            random_password: str = get_random_password(length=args.count)
            print(f"랜덤 비밀번호가 생성되었습니다\n{random_password}")
        else:
            random_password: str = get_random_password()
            print(f"랜덤 비밀번호가 생성되었습니다\n{random_password}")
    except Exception as e:
        print(e)
        sys.exit()

Help 옵션을 이용하여 실행 방법을 확인할 수 있다.

python random_password.py --help
usage: 랜덤 비밀번호 [-h] [-c [COUNT]]

랜덤 비밀번호 생성기

options:
  -h, --help            show this help message and exit
  -c [COUNT], --count [COUNT]
                        Random password digits (16 by default)

아무 옵션도 주지 않고 실행하게 되면 기본 16자리의 랜덤 비밀번호가 생성된다.

python random_password.py
랜덤 비밀번호가 생성되었습니다
R5fi^H2oMxm$8CS8

5자리의 랜덤 비밀번호를 생성하도록 -c, 또는 --count 옵션을 줘보자.

python random_password.py -c 9
랜덤 비밀번호가 생성되었습니다
TTfAWLn12

9자리의 랜덤 비밀번호가 생성되었다.


Loading script...