수색…


통사론

  • 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 ()

xy 사이의 임의의 정수를 반환합니다 (포함).

random.randint(x, y)

예를 들어 1 에서 8 사이의 난수를 얻는 경우

random.randint(1, 8) # Out: 8

randrange ()

random.randrangerange 와 같은 구문을 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

제복

xy 사이의 임의의 부동 소수점 숫자를 반환합니다.

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

씨앗이 고정되어 있기 때문에이 결과는 항상 94 입니다. 특정 숫자가 필요하지 않은 경우에는 값이 동일 할뿐 아니라 getstatesetstate 를 사용하여 이전 상태로 복구 할 수 있습니다.

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

시퀀스를 다시 의사 랜덤 화하려면 Noneseed 하십시오.

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 의 인스턴스를 사용하십시오.

파이썬 3.x 3.6

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")


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow