Python random Modülü: Rastgele Sayı, Seçim ve Karıştırma
Beceri rehberi

Python random Modülü: Rastgele Sayı, Seçim ve Karıştırma

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

random modülü sahte rastgele sayı üretir; rastgele seçim, örnekleme ve karıştırma için kullanılır. Rehber her işlevin farkını, seed ile tekrarlanabilirliği ve secrets uyarısını anlatır.

Bir bakışta

  1. randint iki ucu da kapsar. randrange gibi üst sınırı dışarıda bırakan işlevlerle karıştırmak sık yapılan hatadır.
  2. choice tek, choices tekrarlı, sample tekrarsız seçer. Çekilişte sample, zar atışında choices doğru seçimdir.
  3. shuffle listeyi yerinde karıştırır. None döndürür; orijinali korumak için kopya ya da sample kullanılır.
  4. seed sonucu tekrarlanabilir kılar. Testte ve deneyde sabitlenir, üretimde sabit bırakılmaz.
  5. Güvenlik için random değil secrets kullanılır. Parola, kod ve anahtar üretiminde sahte rastgele üreteçler uygun değildir.

random modülü ne işe yarar

Python'un standart kütüphanesindeki random modülü, sahte rastgele (pseudo-random) sayılar üretir ve bunlarla rastgele seçim, karıştırma ve örnekleme yapar. Kullanım alanları geniştir: test verisi üretmek, oyun ve simülasyon yazmak, bir listeden rastgele örnek almak, eğitim ve doğrulama için veriyi karıştırmak, A/B deneyinde kullanıcıları gruplara bölmek.

Önce bir ayrıma dikkat edin: modülün ürettiği sayılar gerçekten rastgele değil, bir algoritmayla üretilmiş ve aynı başlangıç değerinden aynı diziyi veren sayılardır. Python belgeleri bu üreteçlerin güvenlik amaçlı kullanılmaması gerektiğini, güvenlik ve şifreleme amaçları için secrets modülüne bakılmasını açıkça belirtir. Parola, oturum anahtarı ya da doğrulama kodu üretiyorsanız random değil secrets kullanılır.

Modül şu şekilde içe aktarılır: import random. Sonra random.randint, random.choice gibi işlevleri çağırırsınız.

Rastgele sayı üretmek: random, randint, randrange, uniform

Sayı üretmenin birkaç yolu vardır ve farkları küçük ama önemlidir.

random.random() sıfır ile bir arasında bir ondalıklı sayı verir. Python belgelerine göre aralık sıfırı kapsar, bire kadar ulaşmaz. Olasılık simülasyonlarında "bu olay gerçekleşti mi" sorusunu rastgele sayı ile eşik karşılaştırarak sınarsınız.

random.randint(a, b) iki uç dahil bir tam sayı döndürür; belgeler bunu randrange(a, b + bir) takma adı olarak tanımlar. Zar atmak ya da bir aralıktan sayı çekmek için kullanılır. Burada en sık yapılan hata, üst sınırı dışarıda sanmaktır; randint'te üst sınır dahildir.

random.randrange(dur) ve random.randrange(baslangic, dur, adim) ise range gibi çalışır: üst sınır dışarıdadır ve adım verilebilir. Belgeler anahtar kelimeli argüman kullanmaktan kaçınmayı önerir, çünkü beklenmedik yorumlanabilir.

random.uniform(a, b) iki sınır arasında ondalıklı bir sayı verir. Belgeler, b'nin yuvarlama nedeniyle aralığa dahil olabileceğini veya olmayabileceğini not eder.

import random

zar = random.randint(alt, ust) olasilik = random.random() olcum = random.uniform(alt_deger, ust_deger)

Tam sayı gerekiyorsa randint ya da randrange, ondalıklı sayı gerekiyorsa uniform seçin. Bir olayın gerçekleşme olasılığını denemek için random() ile eşik karşılaştırması yeterlidir.

Listeden rastgele seçim: choice, choices, sample

Listeler üzerinde çalışırken en sık kullanılan üç işlev benzer görünür ama farklı işler yapar.

random.choice(seq) boş olmayan bir diziden tek bir öğe seçer; dizi boşsa IndexError oluşur. random.choices(population, k=adet) ise yerine koyarak seçim yapar: belgelerin ifadesiyle k büyüklüğünde bir liste döndürür ve aynı öğe birden fazla kez gelebilir. weights verilirse seçimler göreli ağırlıklara göre yapılır; weights ve cum_weights birlikte verilirse TypeError, tüm ağırlıklar sıfırsa ValueError oluşur.

random.sample(population, k) ise yerine koymadan örnekleme yapar; k uzunlukta benzersiz öğeler döndürür ve orijinal diziyi değiştirmez. Örnek boyutu popülasyondan büyükse ValueError oluşur. Belgeler populasyondaki tekrarlı değerlerin her birinin ayrı bir seçim olabileceğini de belirtir.

adaylar = ['A', 'B', 'C', 'D']

kazanan = random.choice(adaylar) tekrarli = random.choices(adaylar, k=adet) benzersiz = random.sample(adaylar, k=adet) agirlikli = random.choices(adaylar, weights=agirliklar, k=adet)

Çekiliş gibi aynı kişinin iki kez kazanmaması gereken durumlarda sample; zar atma gibi her atışın bağımsız olduğu durumlarda choices doğru seçimdir. Ağırlıklı seçim, kampanya senaryolarında farklı olasılıkta ödül dağıtımı gibi işlerde işe yarar.

Şekil 1

Doğru işlev, ne istediğinize göre seçilir

Ne yapmak istiyorsunuz?
  1. Tek bir öğe seçmekrandom.choiceDizi boşsa IndexError verir.
  2. Aynı öğenin tekrar gelebileceği çok seçimrandom.choicesAğırlık da verilebilir.
  3. Tekrarsız örnek almakrandom.sampleOrijinal listeyi değiştirmez.
  4. Listeyi yerinde karıştırmakrandom.shuffleDizinin kendisini değiştirir.
Kaynak: Python belgeleri: random modülüMindset Institute

Karıştırma ve tekrar üretilebilirlik: shuffle ve seed

random.shuffle(x) listeyi yerinde karıştırır; yani orijinal listeyi değiştirir ve bir şey döndürmez. Belgeler, değiştirilemeyen bir diziyi karıştırıp yeni bir liste almak için sample(x, k=len(x)) kullanılmasını önerir.

veri = list(kayitlar) random.shuffle(veri)

yeni_sira = random.sample(kayitlar, k=len(kayitlar))

Bir veri setini eğitim ve test parçalarına ayırmadan önce karıştırmak tipik kullanımdır. Orijinal veriyi korumak istiyorsanız önce kopyalayın ya da sample kullanın.

Sahte rastgelelik, aynı başlangıç değeriyle aynı dizinin yeniden üretilebilmesi demektir. random.seed(tohum) bu başlangıç değerini belirler. Belgelere göre tohum verilmezse sistem zamanı ya da varsa işletim sisteminin rastgelelik kaynağı kullanılır. Bir deneyi tekrarlanabilir kılmak, testte aynı veriyle çalışmak ya da bir hatayı yeniden üretmek için tohumu sabitlersiniz.

random.seed(tohum) birinci = random.random() random.seed(tohum) ikinci = random.random() # birinci ve ikinci aynıdır

Üretim ortamında tohum sabitlemeyin; sabit tohum her çalıştırmada aynı "rastgele" sonucu verir. Sabit tohum yalnızca test, öğretim ve tekrarlanabilir analiz içindir.

Güvenlik: random yerine secrets

Python belgelerinin en açık uyarılarından biri şudur: random modülündeki sahte rastgele üreteçler güvenlik amaçlarıyla kullanılmamalıdır; güvenlik ve şifreleme için secrets modülüne bakılmalıdır. Modül tanıtımı, kullanılan algoritmanın tamamen belirlenimci olduğunu ve şifreleme için tamamen uygunsuz olduğunu söyler.

Bunun pratik anlamı: parola, davet kodu, sıfırlama bağlantısı, oturum anahtarı ve tek kullanımlık kod gibi tahmin edilememesi gereken her değer için secrets kullanın. random ile üretilen bir kodun, yeterli örnek gören birisi tarafından tahmin edilebileceği düşünülmelidir.

Belgeler randbytes için de benzer bir uyarı yapar: güvenlik anahtarı üretmek için kullanılmamalı, secrets.token_bytes tercih edilmelidir. Yani konu yalnızca sayı seçimi değil, rastgelenin kullanım amacıdır.

Karar kuralı basit: oyun, simülasyon, örnekleme, test verisi ve karıştırma için random; saldırganın tahmin etmesinin zarar vereceği her yerde secrets. Emin değilseniz secrets daha güvenli taraftır; kullanımı da basittir.

Sık yapılan hatalar

random modülünde tekrar eden hatalar şunlardır:

  • randint'te üst sınırı dışarıda sanmak: randint iki ucu da kapsar, randrange ise üst sınırı kapsamaz.
  • shuffle'ın sonucunu bir değişkene atamaya çalışmak: shuffle listeyi yerinde değiştirir ve None döndürür; yeni_liste = random.shuffle(x) yazmak None bırakır.
  • Boş diziyle choice ya da sample çağırmak: choice boş dizide IndexError verir, sample ise örnek boyutu popülasyondan büyükse ValueError verir.
  • Çekilişte choices kullanmak: choices yerine koyarak seçtiğinden aynı kişi birden fazla kez kazanabilir; tekrarsız seçim için sample kullanılır.
  • Güvenlik amaçlı kodda random kullanmak: parola ve kod üretiminde secrets tercih edilir.
  • Tohumu üretimde sabit bırakmak: sonuçlar tekrar eder ve "rastgele" olmaktan çıkar.
  • Tekrarlanabilirliği unutmak: raporlanan bir analizin yeniden üretilebilmesi gerekiyorsa tohumu kaydedin.

Test yazarken rastgele davranış, hata ayıklamayı zorlaştırır. Çözüm, tohumu testin başında sabitlemek ya da rastgele kaynağı bir parametre olarak fonksiyona vermektir; böylece testte belirli bir dizi üretilebilir.

Bu beceriyi Mindset programlarında nerede çalışırsınız

Python ile Programlama Eğitimi Modüller ve Paketler başlıklı modülü içerir; Data Science Bootcamp da aynı adlı modülle standart kütüphane kullanımını işler. Test verisi üretmek, örnekleme yapmak ya da veriyi karıştırmak isteyen analist ve geliştirici için random, standart kütüphanenin ilk ve en çok kullanılan modüllerinden biridir.

İlgili Mindset programı

Python ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

random.randint ile random.randrange arasındaki fark nedir?

randint iki sınırı da kapsayan bir tam sayı verir; Python belgeleri bunu randrange(a, b + bir) için bir takma ad olarak tanımlar. randrange ise range gibi davranır: üst sınır dışarıdadır ve adım verilebilir. Zar atmak gibi iki ucun dahil olduğu durumlarda randint, belirli adımlı aralıklarda randrange uygundur.

Python'daki rastgele sayılar gerçekten rastgele midir?

Hayır, algoritmayla üretilen sahte rastgele sayılardır; aynı tohumla aynı dizi yeniden elde edilir. Belgeler bu üreteçlerin güvenlik amaçlarıyla kullanılmaması gerektiğini söyler. Simülasyon, örnekleme ve oyun için yeterlidir; parola ya da güvenlik kodu için secrets modülü kullanılmalıdır.

Listeyi karıştırınca neden None dönüyor?

random.shuffle listeyi yerinde değiştirir ve bir değer döndürmez. Sonucu bir değişkene atarsanız None alırsınız. Orijinal listeyi korumak istiyorsanız önce kopyalayıp kopyayı karıştırın ya da yeni bir liste veren random.sample(x, k=len(x)) kullanın.

Her çalıştırmada aynı rastgele sonucu nasıl alırım?

random.seed ile tohumu sabitlersiniz. Aynı tohumla başlayan program aynı diziyi üretir. Bu, deneylerin tekrarlanabilir olması, testlerin kararlı çalışması ve hataların yeniden üretilmesi için kullanışlıdır. Üretim ortamında tohumu sabit bırakmayın, çünkü sonuçlar tahmin edilebilir hale gelir.

choices ile sample arasında ne fark var?

choices yerine koyarak seçer, bu yüzden aynı öğe birden fazla kez gelebilir ve ağırlık verilebilir. sample ise yerine koymadan seçer, benzersiz öğeler döndürür ve örnek popülasyondan büyükse hata verir. Çekilişte olduğu gibi tekrarsız seçim istiyorsanız sample doğru seçimdir.