Python Language
Willekeurige module
Zoeken…
Syntaxis
- random.seed (a = None, version = 2) (versie is alleen beschikbaar voor python 3.x)
- random.getstate ()
- random.setstate (state)
- random.randint (a, b)
- random.randrange (stop)
- random.randrange (start, stop, step = 1)
- random.choice (volgende)
- random.shuffle (x, random = random.random)
- random.sample (populatie, k)
Willekeurig en sequenties: shuffle, keuze en sample
import random
shuffle ()
U kunt random.shuffle()
om de items in een veranderlijke en indexeerbare volgorde te mixen / willekeurig te maken. Bijvoorbeeld een 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!
keuze()
Neemt een willekeurig element uit een willekeurige volgorde :
print(random.choice(laughs))
# Out: He # Output may vary!
monster()
Net als bij de choice
zijn willekeurige elementen uit een willekeurige reeks nodig, maar u kunt opgeven hoeveel:
# |--sequence--|--number--|
print(random.sample( laughs , 1 )) # Take one element
# Out: ['Ho'] # Output may vary!
er is niet twee keer hetzelfde element voor nodig:
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: steekproef groter dan populatie
Willekeurige gehele getallen en floats maken: randint, randrange, random en uniform
import random
randInt ()
Retourneert een willekeurig geheel getal tussen x
en y
(inclusief):
random.randint(x, y)
Bijvoorbeeld om een willekeurig getal tussen 1
en 8
:
random.randint(1, 8) # Out: 8
randrange ()
random.randrange
heeft dezelfde syntaxis als range
en in tegenstelling tot random.randint
is de laatste waarde niet inclusief:
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)
willekeurig
Retourneert een willekeurig getal met drijvende komma tussen 0 en 1:
random.random() # Out: 0.66486093215306317
uniform
Retourneert een willekeurig getal met drijvende komma tussen x
en y
(inclusief):
random.uniform(1, 8) # Out: 3.726062641730108
Reproduceerbare willekeurige getallen: Seed en State
Als u een specifiek zaadje instelt, maakt u een reeks met een vast willekeurig nummer:
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
Door het zaadje opnieuw in te stellen, wordt dezelfde "willekeurige" volgorde opnieuw gemaakt:
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
Omdat het zaad is gefixeerd, zijn deze resultaten altijd 9
en 4
. Als het hebben van specifieke getallen niet vereist is, alleen dat de waarden hetzelfde zijn, kunt u ook gewoon getstate
en setstate
gebruiken om naar een vorige status te herstellen:
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
Om pseudo-willekeurig de volgorde je weer seed
met None
:
random.seed(None)
Of roep de seed
methode zonder argumenten aan:
random.seed()
Creëer cryptografisch veilige willekeurige getallen
Standaard gebruikt de willekeurige Python-module de Mersenne Twister PRNG
om willekeurige getallen te genereren, die, hoewel geschikt in domeinen zoals simulaties, niet voldoen aan de beveiligingsvereisten in meer veeleisende omgevingen.
Om een cryptografisch veilig pseudorandom-nummer te creëren, kan men SystemRandom
dat, door os.urandom
, kan fungeren als een Cryptografisch veilige pseudorandom-nummergenerator, CPRNG .
De eenvoudigste manier om het te gebruiken, is simpelweg het initialiseren van de klasse SystemRandom
. De beschikbare methoden zijn vergelijkbaar met die welke door de willekeurige module worden geëxporteerd.
from random import SystemRandom
secure_rand_gen = SystemRandom()
Om een willekeurige reeks van 10 int
s in bereik [0, 20]
, kan men eenvoudig randrange()
aanroepen:
print([secure_rand_gen.randrange(10) for i in range(10)])
# [9, 6, 9, 2, 2, 3, 8, 0, 9, 9]
Om een willekeurig geheel getal in een bepaald bereik te maken, kan men randint
:
print(secure_rand_gen.randint(0, 20))
# 5
en dienovereenkomstig voor alle andere methoden. De interface is precies hetzelfde, de enige verandering is de onderliggende nummergenerator.
Je kunt os.urandom
direct gebruiken om cryptografisch veilige willekeurige bytes te verkrijgen.
Een willekeurig gebruikerswachtwoord maken
Om een willekeurig gebruikerswachtwoord te maken, kunnen we de symbolen in de string
gebruiken. Specifiek punctuation
voor leestekens, ascii_letters
voor letters en digits
voor cijfers:
from string import punctuation, ascii_letters, digits
We kunnen vervolgens al deze symbolen combineren in een naam met de naam symbols
:
symbols = ascii_letters + digits + punctuation
Verwijder een van deze om een pool van symbolen met minder elementen te maken.
Hierna kunnen we random.SystemRandom
gebruiken om een wachtwoord te genereren. Voor een wachtwoord van 10 lengte:
secure_random = random.SystemRandom()
password = "".join(secure_random.choice(symbols) for i in range(10))
print(password) # '^@g;J?]M6e'
Merk op dat andere routines die onmiddellijk beschikbaar zijn gemaakt door de random
module - zoals random.choice
, random.randint
, etc. - ongeschikt zijn voor cryptografische doeleinden.
Achter de gordijnen gebruiken deze routines de Mersenne Twister PRNG , die niet voldoet aan de eisen van een CSPRNG . Daarom moet u met name geen van deze gebruiken om wachtwoorden te genereren die u van plan bent te gebruiken. Gebruik altijd een exemplaar van SystemRandom
zoals hierboven weergegeven.
Vanaf Python 3.6 is de secrets
beschikbaar die cryptografisch veilige functionaliteit blootlegt.
Onder verwijzing naar de officiële documentatie , om "een alfanumeriek wachtwoord van tien tekens met ten minste één kleine letter, ten minste één hoofdletter en ten minste drie cijfers" te genereren , zou u:
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
Willekeurige binaire beslissing
import random
probability = 0.3
if random.random() < probability:
print("Decision with probability 0.3")
else:
print("Decision with probability 0.7")