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 fördelningsgraf

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.

Python 3.x 3.6

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow