Hilbijartin, nimûne, û vebijarkên ku ji navnîşek di Python-ê de hêmanên bi korfelaqî hilbijêrin.

Dikan

Fonksiyonên hilbijartina(), nimûne(), û vebijarkên() di modula rasthatî ya pirtûkxaneya standarda Python de dikare were bikar anîn da ku hêmanên ji navnîşek, pirtik, rêzek, an tiştên din ên rêzê bi rengekî bêhemdî hilbijêrin û bistînin.

hilbijartina () yek hêmanek, nimûne () û bijartî () navnîşek gelek hêmanan digire. nimûne() derxistina ne-vegerandin bêyî dubareyan e, bijartî() derxistina bi dubareyan e.

Agahiyên jêrîn li vir têne pêşkêş kirin.

  • Yek elementek bi rasthatinî hilbijêrin.:random.choice()
  • Bi rasthatinî gelek hêman hilbijêrin (bê dubare):random.sample()
  • Bi rasthatinî gelek hêman hilbijêrin (bi dubareyan):random.choices()
  • Tovê hejmarê rasthatî rast bikin

Yek elementek bi rasthatinî hilbijêrin.:random.choice()

Bi fonksiyona modulê ya rasthatî hilbijêre (), yek hêmanek bi korfelaqî ji navnîşê tê hilbijartin û dikare were derxistin.

import random

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

print(random.choice(l))
# 1

Heman tişt ji bo tîp û têlan jî derbas dibe. Di warê têlan de, karakterek yekane tê hilbijartin.

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

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

Heke navnîşek vala, pirtik, an rêzek wekî arguman were destnîşankirin xeletiyek.

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

Bi rasthatinî gelek hêman hilbijêrin (bê dubare):random.sample()

Bi nimûneya fonksiyonê() ya modulê ya rasthatî, hûn dikarin ji navnîşek bêserûber gelek hêmanan bistînin. Dubarkirina hêmanan tune (derxistina ne-vegerandin).

Argumana yekem lîsteyek e, û argûmana duyemîn jî hejmara hêmanên ku têne wergirtin e. Lîsteya tê vegerandin.

import random

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

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

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

Ger argumana duyemîn li 1-ê were danîn, navnîşek bi yek elementek jî tê vegerandin; heke 0 were danîn, lîste vala ye. Ger argumana duyemîn 1 be, lîsteyek bi yek hêman tê vegerandin; heke ew 0 be, navnîşek vala tê vegerandin; heke argumana yekem ji hejmara hêmanên di lîsteyê de zêdetir be, xeletiyek çêdibe.

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

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

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

Ger argûmana yekem titek an rêzek be, ya ku tê vegerandin dîsa jî navnîşek e.

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

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

Ger tu dixwazî ​​vegerî tuple an rêzek, tuple(),join() bikar bînin.

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

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

Bala xwe bidinê ku nirx nayê darizandin, ji ber vê yekê heke navnîşa orîjînal an pirjimar hêmanên bi heman nirxê hebin, îhtîmalek heye ku heman nirx were hilbijartin.

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

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

Heke hûn dixwazin ji nirxên dubare dûr bixin, hûn dikarin set() bikar bînin da ku wê veguhezînin komek (cureyê sazûmanek) û tenê hêmanên bêhempa derxînin, û dûv re nimûne () bikar bînin.

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

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

Bi rasthatinî gelek hêman hilbijêrin (bi dubareyan):random.choices()

Vebijarkên fonksiyonê yên modulê yên rasthatî () dihêle hûn gelek hêmanan bi awakî bêhemdî ji navnîşek derxînin, û berevajî nimûne (), ew dihêle ku hêmanên dubare werin hilbijartin.

Choices () fonksiyonek e ku di Python 3.6 de hatî zêdekirin. Ew di guhertoyên berê de peyda nabe.

Argumenta k hejmara hêmanên ku bêne wergirtin diyar dike. Dubarekirin destûr e, ji ber vê yekê hejmara hêmanên ku werin vegerandin dikare ji hejmara hêmanên di navnîşa orîjînal de mezintir be.

Ji ber ku k argumanek tenê-keyword-ê ye, pêdivî ye ku meriv bêjeyek wekî k=3 diyar bike.

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]

Nirxa xwerû ya k 1 e; heke ew ji holê were rakirin, navnîşek bi 1 hêman tê vegerandin.

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

Giraniya argumanan dikare were bikar anîn da ku giraniya (îhtîmala) ku her hêman were hilbijartin were destnîşankirin, û celebê hêmanên di navnîşê de dikare bibe int an 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]

Argumana cum_weights jî dikare wekî giraniyek berhevkirî were destnîşan kirin. cum_weights di koda nimûneya jêrîn de bi pîvanên yekem ên jorîn re hevwate ye.

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

Ji bo her du argumanên giranî û cum_weights vesazkirî Tune ye, ev tê vê wateyê ku her hêman bi heman îhtimalê tê hilbijartin.

Ger dirêjahiya (hejmara hêmanan) giraniyên argumanan an cum_weights ji navnîşa orîjînal cûda be, xeletiyek çêdibe.

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

Di heman demê de destnîşankirina giranî û cum_weights jî xeletiyek e.

# 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

Me lîsteyek wekî argumana yekem wekî mînakek di koda nimûneyê de heya nuha diyar kiriye, lê heman tişt ji bo tîp û rêzan jî derbas dibe.

Tovê hejmarê rasthatî rast bikin

Bi dayîna jimareyek bêkêmasî ji fonksiyona moduleya random seed(), tovê hejmarên rasthatî dikare were rast kirin û çêkerê jimareyên random dikare were destpêkirin.

Piştî destpêkirina bi heman tovê, hêman her gav bi heman rengî têne hilbijartin.

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

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