Python Language
무작위 모듈
수색…
통사론
- random.seed (a = None, version = 2) (버전은 파이썬 3.x에서만 사용 가능합니다)
- random.getstate ()
- random.setstate (state)
- random.randint (a, b)
- random.randrange (정지)
- random.randrange (시작, 중지, 단계 = 1)
- random.choice (seq)
- random.shuffle (x, random = random.random)
- random.sample (population, k)
무작위 및 시퀀스 : 셔플, 선택 및 샘플
import random
혼합()
random.shuffle()
을 사용하여 변경 가능하고 인덱싱 가능한 시퀀스의 항목을 혼합 / 랜덤 random.shuffle()
수 있습니다. 예를 들어 list
:
laughs = ["Hi", "Ho", "He"]
random.shuffle(laughs) # Shuffles in-place! Don't do: laughs = random.shuffle(laughs)
print(laughs)
# Out: ["He", "Hi", "Ho"] # Output may vary!
선택()
무작위 순서 에서 임의의 요소를 가져옵니다.
print(random.choice(laughs))
# Out: He # Output may vary!
견본()
choice
과 마찬가지로 임의의 시퀀스 에서 무작위 요소를 취하지 만 몇 개를 지정할 수 있습니다.
# |--sequence--|--number--|
print(random.sample( laughs , 1 )) # Take one element
# Out: ['Ho'] # Output may vary!
동일한 요소를 두 번 사용하지 않습니다.
print(random.sample(laughs, 3)) # Take 3 random element from the sequence.
# Out: ['Ho', 'He', 'Hi'] # Output may vary!
print(random.sample(laughs, 4)) # Take 4 random element from the 3-item sequence.
ValueError : 채우기보다 큰 샘플
임의의 정수 및 부동 소수점 생성 : randint, randrange, random 및 uniform
import random
randint ()
x
와 y
사이의 임의의 정수를 반환합니다 (포함).
random.randint(x, y)
예를 들어 1
에서 8
사이의 난수를 얻는 경우
random.randint(1, 8) # Out: 8
randrange ()
random.randrange
는 range
와 같은 구문을 range
random.randint
와 달리 마지막 값은 포함 되지 않습니다 .
random.randrange(100) # Random integer between 0 and 99
random.randrange(20, 50) # Random integer between 20 and 49
random.rangrange(10, 20, 3) # Random integer between 10 and 19 with step 3 (10, 13, 16 and 19)
무작위의
0에서 1 사이의 임의의 부동 소수점 숫자를 반환합니다.
random.random() # Out: 0.66486093215306317
제복
x
와 y
사이의 임의의 부동 소수점 숫자를 반환합니다.
random.uniform(1, 8) # Out: 3.726062641730108
재현 가능한 난수 : 시드 및 상태
특정 시드를 설정하면 고정 된 난수 시리즈가 생성됩니다.
random.seed(5) # Create a fixed state
print(random.randrange(0, 10)) # Get a random integer between 0 and 9
# Out: 9
print(random.randrange(0, 10))
# Out: 4
시드를 재설정하면 동일한 '임의의'시퀀스가 다시 생성됩니다.
random.seed(5) # Reset the random module to the same fixed state.
print(random.randrange(0, 10))
# Out: 9
print(random.randrange(0, 10))
# Out: 4
씨앗이 고정되어 있기 때문에이 결과는 항상 9
와 4
입니다. 특정 숫자가 필요하지 않은 경우에는 값이 동일 할뿐 아니라 getstate
및 setstate
를 사용하여 이전 상태로 복구 할 수 있습니다.
save_state = random.getstate() # Get the current state
print(random.randrange(0, 10))
# Out: 5
print(random.randrange(0, 10))
# Out: 8
random.setstate(save_state) # Reset to saved state
print(random.randrange(0, 10))
# Out: 5
print(random.randrange(0, 10))
# Out: 8
시퀀스를 다시 의사 랜덤 화하려면 None
을 seed
하십시오.
random.seed(None)
또는 인수없이 seed
메소드를 호출하십시오.
random.seed()
암호로 안전한 난수 생성
기본적으로 Python 임의 모듈은 Mersenne Twister PRNG
를 사용하여 PRNG
를 생성합니다. 시뮬레이션과 같은 도메인에서는 적합하지만 더 까다로운 환경에서도 보안 요구 사항을 충족시키지 못합니다.
암호 학적으로 안전한 의사 난수를 생성하기 위하여, 하나는 사용할 수 SystemRandom
사용하는 os.urandom
, 암호 보안 의사 랜덤 넘버 생성기의 역할을 할 수있다 CPRNG .
그것을 사용하는 가장 쉬운 방법은 단순히 SystemRandom
클래스를 초기화하는 SystemRandom
입니다. 제공된 메소드는 임의 모듈이 내 보낸 메소드와 유사합니다.
from random import SystemRandom
secure_rand_gen = SystemRandom()
범위 [0, 20]
에 10 int
의 임의의 순서를 만들려면 간단히 randrange()
를 호출 randrange()
.
print([secure_rand_gen.randrange(10) for i in range(10)])
# [9, 6, 9, 2, 2, 3, 8, 0, 9, 9]
주어진 범위에서 임의의 정수를 생성하려면, randint
를 사용할 수 있습니다 :
print(secure_rand_gen.randint(0, 20))
# 5
따라서 다른 모든 방법들에 대해서. 인터페이스는 정확히 동일하지만 유일한 변경은 기본 숫자 생성기입니다.
os.urandom
직접 사용하여 암호 학적으로 안전한 임의의 바이트를 얻을 수도 있습니다.
무작위 사용자 암호 만들기
무작위 사용자 암호를 만들기 위해 string
모듈에 제공된 기호를 사용할 수 있습니다. 특히 punctuation
문장 기호, ascii_letters
문자와 대한 digits
숫자에 대한 :
from string import punctuation, ascii_letters, digits
그런 다음이 모든 심볼을 symbols
이라는 이름으로 결합 할 수 있습니다.
symbols = ascii_letters + digits + punctuation
이들 중 하나를 제거하여 더 적은 수의 요소로 기호 풀을 작성하십시오.
그 후 random.SystemRandom
을 사용하여 암호를 생성 할 수 있습니다. 길이가 10 인 비밀번호의 경우 :
secure_random = random.SystemRandom()
password = "".join(secure_random.choice(symbols) for i in range(10))
print(password) # '^@g;J?]M6e'
random.choice
, random.randint
등과 같이 random
모듈이 즉시 사용할 수있는 다른 루틴은 암호화 목적에 적합하지 않습니다 .
이 커튼 뒤에는 CSPRNG 의 요구 사항을 충족시키지 않는 Mersenne Twister PRNG 가 사용 됩니다. 따라서 특히 사용하려는 암호를 생성 할 때 암호를 사용해서는 안됩니다. 위에서와 같이 항상 SystemRandom
의 인스턴스를 사용하십시오.
Python 3.6부터는 암호로 안전한 기능을 제공하는 secrets
모듈을 사용할 수 있습니다.
공식 문서를 인용하여 "적어도 하나의 소문자, 하나 이상의 대문자 및 적어도 3 개의 숫자가있는 10 자의 영숫자 암호 를 생성하려면 다음을 수행 할 수 있습니다.
import string
alphabet = string.ascii_letters + string.digits
while True:
password = ''.join(choice(alphabet) for i in range(10))
if (any(c.islower() for c in password)
and any(c.isupper() for c in password)
and sum(c.isdigit() for c in password) >= 3):
break
무작위 이진 결정
import random
probability = 0.3
if random.random() < probability:
print("Decision with probability 0.3")
else:
print("Decision with probability 0.7")