Valinta, näyte ja valinnat, joilla valitaan satunnaisesti elementtejä luettelosta Pythonissa.

liiketoiminta

Pythonin standardikirjaston random-moduulin funktioita choice(), sample() ja choices() voidaan käyttää listan, tuplen, merkkijonon tai muun sekvenssiobjektin elementtien satunnaiseen valintaan ja hakemiseen (satunnaisotanta).

choice() saa yhden elementin, sample() ja choices() saavat luettelon useista elementeistä. sample() on palautumaton poiminta ilman kaksoiskappaleita, choices() on palautuva poiminta kaksoiskappaleiden kanssa.

Seuraavat tiedot annetaan tässä.

  • Valitse yksi elementti satunnaisesti.: random.choice()
  • Valitse satunnaisesti useita elementtejä (ei kaksoiskappaleita).: random.sample()
  • Valitse satunnaisesti useita elementtejä (kaksoiskappaleiden kanssa).: random.choices()
  • Vahvista satunnaislukujen siemen

Valitse yksi elementti satunnaisesti.: random.choice()

Satunnaismoduulin funktiolla choose() yksi elementti valitaan satunnaisesti listasta ja se voidaan hakea.

import random

l = [0, 1, 2, 3, 4]

print(random.choice(l))
# 1

Sama pätee tupleihin ja merkkijonoihin. Merkkijonojen tapauksessa valitaan yksi merkki.

print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy

print(random.choice('abcde'))
# b

Virhe, jos argumenttina on tyhjä lista, tuple tai merkkijono.

# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence

Valitse satunnaisesti useita elementtejä (ei kaksoiskappaleita).: random.sample()

Random-moduulin funktiolla sample() voit poimia listasta satunnaisesti useita elementtejä. Elementtien päällekkäisyyttä ei tapahdu (ei-palautuva poiminta).

Ensimmäinen argumentti on lista ja toinen argumentti on haettavien elementtien määrä. Lista palautetaan.

import random

l = [0, 1, 2, 3, 4]

print(random.sample(l, 3))
# [2, 4, 0]

print(type(random.sample(l, 3)))
# <class 'list'>

Jos toisen argumentin arvoksi asetetaan 1, palautetaan myös lista, jossa on yksi elementti; jos sen arvoksi asetetaan 0, lista on tyhjä. Jos toinen argumentti on 1, palautetaan lista, jossa on yksi elementti; jos se on 0, palautetaan tyhjä lista; jos ensimmäinen argumentti on suurempi kuin listan elementtien määrä, tapahtuu virhe.

print(random.sample(l, 1))
# [3]

print(random.sample(l, 0))
# []

# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative

Jos ensimmäinen argumentti on tuple tai merkkijono, palautetaan silti lista.

print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']

print(random.sample('abcde', 2))
# ['b', 'e']

Jos haluat palata tupleen tai merkkijonoon, käytä tuple(),join().

print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')

print(''.join(random.sample('abcde', 2)))
# dc

Huomaa, että arvoa ei arvioida, joten jos alkuperäinen lista tai tuple sisältää elementtejä, joilla on sama arvo, on mahdollista, että sama arvo valitaan.

l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]

print(random.sample(l_dup, 3))
# [3, 1, 1]

Jos haluat välttää päällekkäiset arvot, voit käyttää set()-toimintoa muuttaaksesi sen joukoksi (set-tyyppi) ja poimia vain ainutlaatuiset elementit ja käyttää sitten sample()-toimintoa.

print(set(l_dup))
# {0, 1, 2, 3}

print(random.sample(set(l_dup), 3))
# [1, 3, 2]

Valitse satunnaisesti useita elementtejä (kaksoiskappaleiden kanssa).: random.choices()

Random-moduulin funktiolla choices() voit hakea useita elementtejä satunnaisesti listasta, ja toisin kuin sample(), se sallii päällekkäisten elementtien valinnan.

choices() on Python 3.6:ssa lisätty funktio. Se ei ole käytettävissä aiemmissa versioissa.

Argumentti k määrittää haettavien elementtien lukumäärän. Monistaminen on sallittua, joten haettavien elementtien määrä voi olla suurempi kuin alkuperäisen listan elementtien määrä.

Koska k on vain avainsana-argumentti, on tarpeen määrittää avainsana, esimerkiksi k=3.

import random

l = [0, 1, 2, 3, 4]

print(random.choices(l, k=3))
# [2, 1, 0]

print(random.choices(l, k=10))
# [3, 4, 1, 4, 4, 2, 0, 4, 2, 0]

Oletusarvo k:lle on 1; jos se jätetään pois, palautetaan lista, jossa on yksi elementti.

print(random.choices(l))
# [1]

Argumentilla weights voidaan määrittää paino (todennäköisyys), jolla kukin elementti valitaan, ja listan elementtien tyyppi voi olla int tai float.

print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1]))
# [0, 2, 3]

print(random.choices(l, k=3, weights=[1, 1, 0, 0, 0]))
# [0, 1, 1]

Argumentti cum_weights voidaan määrittää myös kumulatiivisena painona. Seuraavassa esimerkkikoodissa cum_weights vastaa edellä mainittua ensimmäistä painoa.

print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]

Molempien argumenttien weights ja cum_weights oletusarvo on None, mikä tarkoittaa, että jokainen elementti valitaan samalla todennäköisyydellä.

Jos argumentin weights tai cum_weights pituus (elementtien määrä) poikkeaa alkuperäisestä luettelosta, tapahtuu virhe.

# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_

On myös virhe määrittää painot ja cum_weights samanaikaisesti.

# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1], cum_weights=[1, 2, 3, 13, 14]))
# TypeError: Cannot specify both weights and cumulative weights

Tähänastisessa esimerkkikoodissa olemme määrittäneet listan ensimmäiseksi argumentiksi, mutta sama pätee myös tupleihin ja merkkijonoihin.

Vahvista satunnaislukujen siemen

Antamalla satunnaismoduulin funktiolle seed() mielivaltainen kokonaisluku, satunnaislukujen siemen voidaan määrittää ja satunnaislukugeneraattori voidaan alustaa.

Kun elementit on alustettu samalla siemenellä, ne valitaan aina samalla tavalla.

random.seed(0)
print(random.choice(l))
# 3

random.seed(0)
print(random.choice(l))
# 3
Copied title and URL