makaleler / Python Kütüphaneleri / Python Random 'Rastgele Sayılar'

Python Random 'Rastgele Sayılar'

14.10.2014 14:36:54

Sözde Rastgele Sayıların Oluşturulması Konusunu İncelemeye Çalıştık.

Sözde Rastgele Sayılar Yaratmak

Bu modül, çeşitli dağılımlar için sözde rastgele sayı (pseudo-random) yaratma işlemini yerine getirmektedir.

Tam sayılar için, tekdüze seçim ve diziler için ise rastgele bir elementin tekdüze seçimidir. Yerinde bir listenin rastgele permütasyonunu yaratan bir fonksiyon, ve değişkensiz rastgele örnekleme için bir fonskiyon.

Gerçek doğru üzerinde, tekdüzeliği, normal (Gaussian), lognormal, negatif üstel, gamma ve beta dağılımları hesaplayan fonksiyonlar vardır. Açıların dağılımını yaratmak için Von Misses dağılımı mevcuttur.

Hemen hemen bütün modül fonsiyonları, yarı açık aralıktan [0.0, 1.0) tekdüze bir şekilde rastgele kaydırma yaratan basit bir fonksiyon olan random() üzerine dayanmaktadır. Python, Mersenne Twister’ı ana üreteci olarak kullanır. 53 bitlik kesin kaydırmalar ve 2**19937-1 lik bir periyoda sahiptir. C’nin altında yatan asıl uygulanan şey hem hızlı ve hem de threadsafe olmasıdır. Mersenne Twister, mevcut rastgele (random) numara üreticilerinden en yoğun şekilde test edilenlerinden birisidir. Ancak tamamen rastgele olmadığı için, bütün kullanımlar için uygun değildir ve kriptografik amaçlar kullanımı için kesinlikle uygun değildir.

Bu modülden sağlanan fonksiyonlar, aslında, rastgeleliğin saklı bir örneğinin bağımlı yöntemleridir. Random sınıfı. Durumu paylaşmayan üreticiler edinebilmek için, kendi rastgele örneğinizi somutlaştırabilirsiniz. Bu özellikle her thread için farklı rastgele örnek yaratan ve her bir thread tarafından görülen yaratılan dizilerin çakışmamasını mümkün kılan jumpahead() methodunu kullanan multi-threaded programlar için çok yararlıdır.

Eğer istediğiniz farklı ana üretici kullanmak isterseniz, Random sınıfı da alt sınıflara ayrılabilir. Bu durumda, random(), seed(), setstate(), ve jumpahead() methodlarını geçersiz kılınız. İsteğe bağlı olarak, yeni bir üretici getrandbits() methodunu sağlayabilir ve bu method ile randrange() fonksiyonunun rastgele geniş bir aralıktan seçenekler üretmesine olanak verir.


Versiyon 2.4’de yenilenmiştir. ( getrandbits() Methodu )

Alt sınıflamaya örnek vermek gerekirse, random modülünün sağladığı saf Python’daki alternatif üretici görevini gören Wichman-Hill sınıfını örnek gösterebiliriz. Bu sınıf, Wichmann-Hill algoritmasını ana üretici olarak kullanan Pythonun eski versiyonlarndan gelen sonucları tekrar üretmek için uyumlu bir geriye dönüş yolu sağlar. Unutmayınız ki bu Wichmann-Hill üreticileri artık tavsiye edilmemektedir ve periyodu günümüz standartlarına çok kısadır ve yaratılan diziler bazı zorlu random testlerinden başarısız olduğu bilinmektedir. Aşağıda bu hataları gideren yeni değişkeleri bakabilirsiniz.
2,3’ de Değişenler : MersenneTwister, Wichmann-Hill ile varsayılan üretici olarak değiştirilmiştir.
Rastgele modülü, aynı zamanda, operator sistemi tarafından sağlanan kaynaklardan rastgele sayı üreten sistem fonksiyonu os.urandom() ’u kulanan, SystemRandom sınıfını da sağlamaktadır.


UYARI

Bu modülün sözde rastgele sayı üreticisi, güvenlik amaçları için kulanılmamadır. : Eğer kriptolu sözde rastgele sayı üreticisi gerekiyor ise, os.random() veya SystemRandom ‘ı kullanınız.


Kırtasiye fonksiyonları:
random.seed()

Ana rastgele numara üreticisini başlatınız. Opsiyonel argüman x tekrar edilebilen herhangi bir obje olabilir. Eğer x yok sayılırsa ve ya yoksa, varsayılan sistem zamanı kullanılır. Modül ilk içe alındığı zaman, varsayılan sistem zamanı aynı zamanda üreticiyi başlatmak için de kullanılır. Eğer rastgelelik kaynakları operatör sistemi tarafından sağlanıyor ise, sistem zamanı yerine rastgelelik kaynakları kullanılır.

Versiyon 2.4’ de değişenler: daha önceleri operatör sistem kaynakları kullanılmıyordu.


random.getstate()

Üreticinin varsayılan iç durumunu yakalayan bir objeye dönünüz. Bu obje, durumu restore etmek için setstate()’e geçebilir.

Versiyon 2.1’ de yenilenmiştir.
Versiyon 2.6’da değişenler: Pyhton 2.6’da üretilen durum değerleri, daha önceki versiyonlara yüklenemez.


random.setstate(state)

Durum, getstate() ve üreticinin iç durumunu daha önceleri getstate() olarak adlandırılan fonksiyona depolayan setstate() ’e bir önceki çağrıdan elde edilmeliydi.


Verisyon 2.1’deki yenilenmiştir.
random.jumpahead(n)

İç durumu, bir diğerinden ve ya varsayılan durumdan mümkün uzaklıktaki ile değiştiriniz. N, mevcut durum vektörünü karıştırmak için kullanılan, negative olmayan bir tam sayıdır. Bu multi-thread programlarda çok yararlıdır. Bağlantılı olarak çoklu Random sınıfının örneklerinde, setstate() vey a seed() bütün örnekleri aynı iç durumun içine zorlamada kullanılabilir ve sonra jumpahead() bütün örnekleri durumdan uzağa itmek için kullanılabilir.
Versiyon 2.1’deki yenilenmiştir..
Versiyon 2.3’de değişenler: Belirli bir duruma atlamak yerine, n bir adım öne atlar, jumpahead(), bir çok adımla ayrılan diğer muhtemel durumlara atlar.
random.getrandbits(k)
Bir python uzun int ve k random bitlerine döner. Bu metod, MersenneTwister üreticisi ile desteklenir ve bazı diğer üreticiler de API’nin opsiyonel parçası olarak sağlayabilir. Uygun olduğunda, getrandbits(), randrange()’in rastgele uzun aralıkları işlemesine olanak sağlar.


Versiyon 2.4’de yenilenmiştir.

Tamsayılar için fonksiyonlar:
random.randrange(stop)
random.randrange(start, stop)
(start, stop, step) Serisinden rastgele seçilen bir elemente döner. Bu tercih edilene eşittir, ama gerçekten bir nesne dizisi yaratmaz.
Versiyon 1.5.2.’ de yenilenmiştir.
random.randint(a, b)
<= N <= b gibi olan rastgele bir N tamsayısına döner..

Diziler için Fonksiyonlar:
random.choice(seq)
Boş olmayan bir seq. dizisinden rastgele bir elemente döner. Eğer seq boş ise, IndexError’ü verir.
random.shuffle(x)
Parantez içindeki x dizisini değiştirir. Opsiyonel değişken random 0- değişken fonsiyonu, varsayınlan tarafından ki random() fonksiyonudur, [0.0, 1.0) arasında bir rastgele değer alır.

Oldukça küçük olan len (x) için bile dikkat ediniz. x’in toplan permütasyonlarının sayısı çoğu rastgele sayı üreteçlerinin noktalarından daha büyüktür. Bu, çoğu uzun dizilerin permütasyonlarının hiç bir zaman üretemileyeceğini göstermektedir.
random.sample(population, k)
Dizilerin populasyonundan seçilmiş k uzunluğundaki eşsiz elementlerin listesine döner. Değiştirilmeyen random örneği için kullanılır.

Versiyon 2.3’de yenidir.
Orjinal popülasyonu değiştirilmemiş olarak bırakırken, popülasyondan elementleri içeren yeni bir listeye dönüştürür. Sonuç listesi seçim düzenindedir ve böylece bütün alt dilimler random örnekleri için geçerli kalacaktır. Bu, çekilişi kazananları (Örnekleri) büyük ödül ve ikinci sıra kazananların (Alt dilimler) bölünmesine olanak verir.
Popülasyonun üyelerinin, sağlanabilir ve ya eşşiz olması gerekmemektedir. Eğer popülasyon tekrarlar içeriyorsa, o zaman her olay, örnekteki olası bir seçimdir.
Tamsayı dizisinden bir örnek seçmek için, xrange() objesini değişken olarak kullanınız.
Bu özellikle geniş popülasyondan örnek için hızlı ve alan için elverişlidir:

sample(xrange(10000000), 60).
Daha sonraki fonksiyonlar, belirli bir gerçek değerli dağılımlar üretmektedir. Fonksiyon parametreleri dağılım denklemlerindeki karşılık değişkenlerinden sonra isimlendirilmiştir. Matematikte yaygın olarak kullanıldığı gibi, bu denklemlerin çoğu herhangi bir istatistik metininde bulunabilir.
random.random()
[0.0, 1.0) değerleri arasındaki, bir sonraki rastgele kayan nokta numarasına döner.

random.uniform(a, b)
Rastgele bir kayan nokta numarası olan N ‘e döner. Örneğin , <= N <= b için a <= b ve b <= N <= a için b < a
Son nokta değeri b, kaydırma noktasındaki a + (b-a) * random() denklemine dayanan aralığa katılmış ve ya katılmamış olabilir.
random.triangular(low, high, mode)
Rastgele bir kayan nokta numarası olan N ‘e döner. Örneğin, bu sınırlar içerisinde belirlenen mode ile ve low <= N <= high. Mode parametresi, bu sınırlar içinde verilen simetrik dağılımdan orta noktayı saptar

Versiyon 2.6’da yenilenmiştir.
random.betavariate(alpha, beta)
Beta dağılımı. Parametrelerdeki koşullar, alpha > 0 and beta > 0’dır. 0 ve 1 aralığındaki değerlere döner.
random.expovariate(lambd)
Üstel dağılım. Lambd, istenilen ortalamaya bölünen 1.0’dır. Bu 0 olmamalıdır. (Parametre lambda olarak kullanılacaktı, ama bu zaten Python’da kullanılmaktadır.) Eğer lambd pozitif ise, 0’dan sonsuz pozitife kadar olan aralıktaki değerlere dönülür, ve ya lambd negative ise, sonsuz negatiften 0’a kadar dönülür.
random.gammavariate(alpha, beta)
Gamma dağılımı. ( Gamma fonksiyonu ile karıştırmayınız.) Eğer parametredeki değerler
alpha > 0 and beta > 0 ise,


Olası dağılım fonskiyonu:
          x ** (alpha - 1) * math.exp(-x / beta)
pdf(x) =  --------------------------------------
            math.gamma(alpha) * beta ** alpha

random.gauss(mu, sigma)
Gaussian dağılımı. Mu, ortalama olandır ve sigma ise standart sapmadır. Bu aşağıda tanımlanan the normalvariate() fonksiyonun biraz daha hızlıdır.
random.lognormvariate(mu, sigma)
Log normal dağılım. Bu dağılımın doğal logaritmasını alırsanız, ortalam mu ve standart sapma olan sigma ile normal bir dağılım elde edersiniz. Mu herhangi bir değer olabilir ve sigma 0’dan büyük olmalıdır.

random.normalvariate(mu, sigma)
Normal dağılım. Mu ortalamadır ve sigma ise standart sapmadır.
random.vonmisesvariate(mu, kappa)
Mu, 0 ve 2*pi radyanında açıklanan ortalama açıdır. Ve kappa ise 0’a eşit vey a daha büyük olmak zorunda olan konsantrasyon parametresidir. Eğer kappa 0’a eşit ise, bu dağılım 0’dan 2*pi aralığından daha büyük tekdüze bir rastgele açıyı azaltır.
random.paretovariate(alpha)
Pareto dağılım. Alpha, biçim parametresidir.
random.weibullvariate(alpha, beta)
Weibull dağılım. Aplha, ölçek parametresi ve beta ise biçim parametresidir.

Alternatif Üreticiler:
class random.WichmannHill()
Wichmann-Hill algortimasını ana üreteç olarak kabul eden araçları sınıflar. Aynı metodların hepsini, aşağıda tanımlanan whseed() metodu ve üstüne Random olarak alınız. Çünkü bu sınıf, kuramsal teorik Pyhton’da yürütülür. Bu threadsafe değildir ve çağrılar arasında kilitler isteyebilir. Üretecin dönem noktası, iki bağımsız random dizilerinin çakışmamasına dikkat etmeyi gerektirecek kadar küçük olan 6,953,607,871,644’dır.

random.whseed()
Bu artık geçersizdir. Python 2.1’den önceki versiyonlarda bit-level bağdaştırmasını sağlamaktaydı. Detaylar için seed() fonksiyonuna bakınız. Whseed() , belirli tamsayı değişkeninin, belirli iç durumu sağlamasını garanti etmez ve toplamda yaklaşık 2**24 belirli iç durumdan fazla sağlayamaz.

class random.SystemRandom()
Operatör sistemi tarafından sağlanan kaynaklardan üretilen rastgele sayıları üretmede kullanılan fonksiyon olan os.urandom() ‘ı sınıflar. Yazılım durumuna bağlı kalmaz ve diziler tekrar üretilebilir değildir. Bu bağlamda, Seed() ve jumpahead() metodlarının etkisi yoktur ve gözardı edilir. Getstate() ve setstate() methodları, NotImplementedError’u çıktığında kullanılır.
Versiyon 2.4’de yenilenmiştir.

yazar husonet

Yorumlar

Bu içerik için sizde yorum yapabilirsiniz!
Hakan
Hakan
29.10.2016 10:58:23

Merhabalar. Yazdığınız kodu projemde kullandım. Gerçekten çok faydalı olmuş teşekkür ederim...

anasayfa | makaleler | haberler | dosyalar | linkler | hakkımızda