Python standart kitaplığının rasgele modülündeki seçim(), örnek() ve seçimler() işlevleri, bir liste, grup, dize veya başka bir dizi nesnesinden öğeleri rasgele seçmek ve almak için kullanılabilir (rastgele örnekleme).
seçim() tek bir öğe alır, sample() ve options() birden çok öğenin bir listesini alır. sample() kopya içermeyen kurtarılamaz bir ayıklamadır, options() kopyalarla kurtarılabilir bir ayıklamadır.
Aşağıdaki bilgiler burada verilmiştir.
- Rastgele bir öğe seçin.:
random.choice()
- Rastgele birden çok öğe seçin (yinelenen yok):
random.sample()
- Rastgele birden çok öğe seçin (kopyalarla birlikte):
random.choices()
- Rastgele sayı tohumunu düzelt
Rastgele bir öğe seçin.:random.choice()
Rastgele modülün select() işleviyle, listeden rastgele bir öğe seçilir ve geri alınabilir.
import random
l = [0, 1, 2, 3, 4]
print(random.choice(l))
# 1
Aynısı demetler ve dizeler için de geçerlidir. Dize durumunda, tek bir karakter seçilir.
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
Bağımsız değişken olarak boş bir liste, demet veya dize belirtilirse hata.
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
Rastgele birden çok öğe seçin (yinelenen yok):random.sample()
Rastgele modülünün örnek() işleviyle, bir listeden rastgele birden çok öğe alabilirsiniz. Öğelerin tekrarı yoktur (kurtarılamaz çıkarma).
İlk argüman bir listedir ve ikinci argüman alınacak elemanların sayısıdır. Liste döndürü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 bağımsız değişken 1’e ayarlanırsa, tek öğeli bir liste de döndürülür; 0 olarak ayarlanırsa liste boştur. İkinci argüman 1 ise, tek elemanlı bir liste döndürülür; 0 ise boş bir liste döndürülür; ilk argüman listedeki eleman sayısından fazlaysa bir hata oluşur.
print(random.sample(l, 1))
# [3]
print(random.sample(l, 0))
# []
# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative
İlk argüman bir tanımlama grubu veya bir dize ise, döndürülen yine bir listedir.
print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']
print(random.sample('abcde', 2))
# ['b', 'e']
Bir demete veya dizgeye dönmek istiyorsanız, tuple(),join() kullanın.
print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')
print(''.join(random.sample('abcde', 2)))
# dc
Değerin yargılanmadığına dikkat edin, bu nedenle orijinal liste veya demet aynı değere sahip öğeler içeriyorsa, aynı değerin seçilme olasılığı vardır.
l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
print(random.sample(l_dup, 3))
# [3, 1, 1]
Yinelenen değerlerden kaçınmak istiyorsanız, onu bir kümeye (küme türü) dönüştürmek ve yalnızca benzersiz öğeleri çıkarmak için set()’i kullanabilir ve ardından sample()’ı kullanabilirsiniz.
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
Rastgele birden çok öğe seçin (kopyalarla birlikte):random.choices()
Rastgele modülün işlev seçenekleri(), bir listeden rasgele birden çok öğe almanızı sağlar ve sample()’dan farklı olarak, yinelenen öğelerin seçilmesine izin verir.
options(), Python 3.6’da eklenen bir işlevdir. Daha önceki sürümlerde mevcut değildir.
Argüman k, alınacak eleman sayısını belirtir. Çoğaltmaya izin verilir, bu nedenle alınacak öğe sayısı, orijinal listedeki öğe sayısından daha fazla olabilir.
k yalnızca anahtar kelime bağımsız değişkeni olduğundan, k=3 gibi bir anahtar sözcük belirtmek gerekir.
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 varsayılan değeri 1’dir; atlanırsa, 1 elemanlı bir liste döndürülür.
print(random.choices(l))
# [1]
Ağırlıklar argümanı, her bir öğenin seçileceği ağırlığı (olasılığı) belirtmek için kullanılabilir ve listedeki öğelerin türü int veya float olabilir.
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 bağımsız değişkeni ayrıca kümülatif ağırlık olarak da belirtilebilir. Aşağıdaki örnek koddaki cum_weights, yukarıdaki ilk ağırlıklara eşdeğerdir.
print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]
Hem ağırlıklar hem de cum_weights bağımsız değişkenleri için varsayılan Yok’tur; bu, her öğenin aynı olasılıkla seçildiği anlamına gelir.
Argüman ağırlıklarının veya cum_ağırlıkların uzunluğu (eleman sayısı) orijinal listeden farklıysa, bir hata oluşur.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_
Ağırlıkları ve cum_weights’i aynı anda belirtmek de bir hatadı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
Şimdiye kadar örnek kodda örnek olarak ilk argüman olarak bir liste belirledik, ancak aynısı demetler ve dizeler için de geçerlidir.
Rastgele sayı tohumunu düzelt
Rastgele modülün seed() işlevine rasgele bir tamsayı vererek, rasgele sayı tohumu sabitlenebilir ve rasgele sayı üreteci başlatılabilir.
Aynı tohumla başlatmadan sonra, elemanlar her zaman aynı şekilde seçilir.
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3