Python standart kitabxanasının təsadüfi modulundakı seçim(), sample() və options() funksiyaları siyahıdan, sətirdən, sətirdən və ya digər ardıcıllıq obyektindən (təsadüfi seçmə) təsadüfi seçmək və elementləri əldə etmək üçün istifadə edilə bilər.
Choice() tək elementi, sample() və options() çoxlu elementlərin siyahısını əldə edir. sample() dublikatları olmayan bərpa olunmayan çıxarışdır, options() dublikatlarla bərpa edilə bilən çıxarışdır.
Aşağıdakı məlumatlar burada verilir.
- Təsadüfi olaraq bir element seçin.:
random.choice()
- Təsadüfi olaraq birdən çox element seçin (dublikat yoxdur):
random.sample()
- Birdən çox elementi təsadüfi seçin (dublikatlarla):
random.choices()
- Təsadüfi nömrə toxumunu düzəldin
Təsadüfi olaraq bir element seçin.:random.choice()
Təsadüfi modulun select() funksiyası ilə bir element təsadüfi olaraq siyahıdan seçilir və onu əldə etmək olar.
import random
l = [0, 1, 2, 3, 4]
print(random.choice(l))
# 1
Eyni şey tuple və simlərə də aiddir. Sətirlər vəziyyətində tək simvol seçilir.
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
Arqument kimi boş siyahı, sətir və ya sətir göstərildikdə xəta baş verir.
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
Təsadüfi olaraq birdən çox element seçin (dublikat yoxdur):random.sample()
Təsadüfi modulun sample() funksiyası ilə siz siyahıdan təsadüfi bir neçə element əldə edə bilərsiniz. Elementlərin təkrarlanması (bərpa olunmayan çıxarma) yoxdur.
Birinci arqument siyahıdır, ikinci arqument isə əldə ediləcək elementlərin sayıdır. Siyahı geri qaytarılır.
import random
l = [0, 1, 2, 3, 4]
print(random.sample(l, 3))
# [2, 4, 0]
print(type(random.sample(l, 3)))
# <class 'list'>
İkinci arqument 1-ə təyin edilərsə, bir elementi olan siyahı da qaytarılır; əgər 0-a təyin edilibsə, siyahı boşdur. İkinci arqument 1 olarsa, bir elementi olan siyahı qaytarılır; 0 olarsa, boş siyahı qaytarılır; əgər birinci arqument siyahıdakı elementlərin sayından çox olarsa, xəta baş verir.
print(random.sample(l, 1))
# [3]
print(random.sample(l, 0))
# []
# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative
Əgər ilk arqument bir dəst və ya sətirdirsə, qaytarılanlar hələ də siyahıdır.
print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']
print(random.sample('abcde', 2))
# ['b', 'e']
Tuple və ya sətirə qayıtmaq istəyirsinizsə, tuple(),join() istifadə edin.
print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')
print(''.join(random.sample('abcde', 2)))
# dc
Nəzərə alın ki, dəyər mühakimə olunmur, ona görə də orijinal siyahıda və ya dəstdə eyni dəyərə malik elementlər varsa, eyni dəyərin seçilmə ehtimalı var.
l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
print(random.sample(l_dup, 3))
# [3, 1, 1]
Təkrarlanan dəyərlərin qarşısını almaq istəyirsinizsə, onu çoxluğa (dəst növünə) çevirmək və yalnız unikal elementləri çıxarmaq üçün set() funksiyasından istifadə edə və sonra sample() istifadə edə bilərsiniz.
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
Birdən çox elementi təsadüfi seçin (dublikatlarla):random.choices()
Təsadüfi modulun funksiya seçimləri() sizə siyahıdan təsadüfi olaraq birdən çox elementi əldə etməyə imkan verir və sample()-dan fərqli olaraq, dublikat elementləri seçməyə imkan verir.
options() Python 3.6-da əlavə edilmiş funksiyadır. Əvvəlki versiyalarda mövcud deyil.
k arqumenti əldə ediləcək elementlərin sayını təyin edir. Dublikasiyaya icazə verilir, ona görə də əldə ediləcək elementlərin sayı orijinal siyahıdakı elementlərin sayından çox ola bilər.
k yalnız açar sözdən ibarət arqument olduğundan, k=3 kimi açar sözü təyin etmək lazımdır.
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]
k-nin standart dəyəri 1-dir; buraxılıbsa, 1 elementli siyahı qaytarılır.
print(random.choices(l))
# [1]
Arqument çəkiləri hər bir elementin seçiləcəyi çəki (ehtimal) təyin etmək üçün istifadə edilə bilər və siyahıdakı elementlərin növü int və ya float ola bilər.
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]
cum_weights arqumenti də məcmu çəki kimi təyin edilə bilər. Aşağıdakı nümunə kodundakı cum_weights yuxarıdakı ilk çəkilərə bərabərdir.
print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]
Həm çəkilər, həm də cum_weights arqumentləri üçün defolt Yoxdur, yəni hər bir element eyni ehtimalla seçilir.
Arqument çəkilərinin və ya cum_weights uzunluğunun (elementlərin sayı) orijinal siyahıdan fərqli olduğu halda, xəta baş verir.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_
Eyni zamanda çəki və cum_weights müəyyən etmək də xətadır.
# 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
Biz indiyə qədər nümunə kodunda nümunə olaraq ilk arqument kimi siyahı göstərmişik, lakin eyni şey kortejlər və sətirlərə də aiddir.
Təsadüfi nömrə toxumunu düzəldin
Təsadüfi modulun seed() funksiyasına ixtiyari tam ədəd verməklə, təsadüfi ədədlərin toxumunu sabitləşdirmək və təsadüfi ədədlər generatorunu işə salmaq olar.
Eyni toxumla işə salındıqdan sonra elementlər həmişə eyni şəkildə seçilir.
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3