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)

Willekeurige distributiegrafiek

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.

Python 3.x 3.6

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow