Python Language
Slumpmässig modul
Sök…
Syntax
- random.seed (a = Ingen, version = 2) (versionen är endast tillgänglig för python 3.x)
- random.getstate ()
- random.setstate (stat)
- random.randint (a, b)
- random.randrange (stopp)
- random.randrange (start, stopp, steg = 1)
- random.choice (seq)
- random.shuffle (x, random = random.random)
- random.sample (befolkning, k)
Slumpmässiga och sekvenser: blandning, val och prov
import random
blanda()
Du kan använda random.shuffle()
att blanda upp / randomisera objekten i en muterbar och indexerbar sekvens. Till exempel en 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!
val()
Tar ett slumpmässigt element från en godtycklig sekvens :
print(random.choice(laughs))
# Out: He # Output may vary!
prov()
Som choice
tar det slumpmässiga element från en arbiträr sekvens men du kan ange hur många:
# |--sequence--|--number--|
print(random.sample( laughs , 1 )) # Take one element
# Out: ['Ho'] # Output may vary!
det kommer inte att ta samma element två gånger:
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: Prov större än befolkning
Skapa slumpmässiga heltal och flottörer: randint, randrange, random och uniform
import random
randInt ()
Returnerar ett slumpmässigt heltal mellan x
och y
(inklusive):
random.randint(x, y)
Till exempel att få ett slumptal mellan 1
och 8
:
random.randint(1, 8) # Out: 8
randrange ()
random.randrange
har samma syntax som range
och till skillnad från random.randint
är det sista värdet inte inkluderande:
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)
slumpmässig
Returnerar ett slumpmässigt flytande punktnummer mellan 0 och 1:
random.random() # Out: 0.66486093215306317
enhetlig
Returnerar ett slumpmässigt flytande punktnummer mellan x
och y
(inklusive):
random.uniform(1, 8) # Out: 3.726062641730108
Reproducerbara slumpmässiga nummer: Frö och tillstånd
Om du ställer in ett specifikt frö skapas en fast slumpsumarserie:
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
Återställning av fröet skapar samma "slumpmässiga" sekvens igen:
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
Eftersom fröet är fixerat är dessa resultat alltid 9
och 4
. Om det inte bara krävs att ha specifika nummer för att värdena ska vara desamma, kan du bara använda getstate
och setstate
att återställa till ett tidigare tillstånd:
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
För att pseudo-randomisera sekvensen igen seed
med None
:
random.seed(None)
Eller ringa seed
utan några argument:
random.seed()
Skapa kryptografiskt säkra slumpmässiga nummer
Som standard använder Python PRNG
Mersenne Twister PRNG
att generera slumpmässiga nummer, som, även om de är lämpliga i domäner som simuleringar, inte uppfyller säkerhetskraven i mer krävande miljöer.
För att skapa ett kryptografiskt säkert pseudorandomnummer kan man använda SystemRandom
som med hjälp av os.urandom
kan fungera som en kryptografiskt säker pseudorandomnummergenerator, CPRNG .
Det enklaste sättet att använda det innebär helt enkelt att initialisera SystemRandom
klassen. Metoderna som tillhandahålls liknar dem som exporteras av den slumpmässiga modulen.
from random import SystemRandom
secure_rand_gen = SystemRandom()
För att skapa en slumpmässig sekvens på 10 int
i intervallet [0, 20]
kan man helt enkelt ringa randrange()
:
print([secure_rand_gen.randrange(10) for i in range(10)])
# [9, 6, 9, 2, 2, 3, 8, 0, 9, 9]
För att skapa ett slumpmässigt heltal i ett visst intervall kan man använda randint
:
print(secure_rand_gen.randint(0, 20))
# 5
och följaktligen för alla andra metoder. Gränssnittet är exakt samma, den enda förändringen är den underliggande siffergeneratorn.
Du kan också använda os.urandom
direkt för att få kryptografiskt säkra slumpmässiga byte.
Skapa ett slumpmässigt användarlösenord
För att skapa ett slumpmässigt användarlösenord kan vi använda symbolerna i string
. Speciellt punctuation
för skiljetecken, ascii_letters
bokstäver för bokstäver och digits
för siffror:
from string import punctuation, ascii_letters, digits
Vi kan sedan kombinera alla dessa symboler i ett namn som heter symbols
:
symbols = ascii_letters + digits + punctuation
Ta bort någon av dessa för att skapa en pool med symboler med färre element.
Efter detta kan vi använda random.SystemRandom
att generera ett lösenord. För ett lösenord på 10 längder:
secure_random = random.SystemRandom()
password = "".join(secure_random.choice(symbols) for i in range(10))
print(password) # '^@g;J?]M6e'
Observera att andra rutiner som görs omedelbart tillgängliga av den random
modulen - som random.choice
, random.randint
, etc. - är olämpliga för kryptografiska ändamål.
Bakom gardinerna använder dessa rutiner Mersenne Twister PRNG , som inte uppfyller kraven för en CSPRNG . Därför bör du särskilt inte använda någon av dem för att generera lösenord du planerar att använda. Använd alltid en instans av SystemRandom
som visas ovan.
Från Python 3.6 finns secrets
som visar kryptografiskt säker funktionalitet.
Om du citerar den officiella dokumentationen , för att skapa "ett tio-tecken alfanumeriskt lösenord med minst ett gemener, minst ett stort tecken och minst tre siffror", kan du:
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
Slumpmässigt binärt beslut
import random
probability = 0.3
if random.random() < probability:
print("Decision with probability 0.3")
else:
print("Decision with probability 0.7")