Keşfedin, Öğrenin ve Paylaşın
Evrim Ağacı'nda Aradığın Her Şeye Ulaşabilirsin!
Yeni Soru Sor
Paylaşım Yap
Sorulara Dön
Abdulkadir Özcan
Üye 1 ay önce 2 Cevap
8

Python’da üretilen rastgele sayılar ne kadar rastgeledir?

Soru kafa karıştırıyor biraz farkındayım. Görselde Python’da üretilmiş 4-10 arasında 2000 küsür rasgele sayının histogram grafiği var. Açıkçası bana pek rastgele gelmedi. Üniform dağılım testinde de başarılı sonuç vermedi. Bu neden kaynaklanıyor. Bunu aşmanın yolu var mıdır?
812 görüntülenme
Python’da üretilen rastgele sayılar ne kadar rastgeledir?
Python’da üretilen rastgele sayılar ne kadar rastgeledir?
  • Şikayet Et
  • Mantık Hatası
1
  • Paylaş
  • Alıntıla
  • Alıntıları Göster
Tüm Reklamları Kapat
2 Cevap
Adnan Berk
Adnan Berk
69K UP
Bilim Meraklısı 1 ay önce

Aynı soru bende de zamanında kafayı yedirmişti, çünkü "rastgele" deyince insan gerçekten her şeyin tamamen kaotik olmasını bekliyor ama işler biraz farklı yürüyor.

Şimdi Python’da rastgele sayı üretirken aslında tam anlamıyla “gerçek” rastgelelikten bahsetmiyoruz. Python’un kullandığı rastgele sayı üreticisi, matematiksel bir algoritma — yani olaylar tamamen yazılım temelli, fiziksel değil. Bu tür algoritmalara psödo-rastgele sayı üreteci (İngilizcesi: pseudo-random number generator, kısaca PRNG) deniyor. Yani “mış gibi” rastgele. Gerçek değil.

Python’da bu işin kalbi, random modülündeki Mersenne Twister algoritması. Bu algoritma oldukça iyi, hatta çoğu iş için gayet yeterli ama mükemmel değil. Bazen dağılımda küçük dengesizlikler göze çarpabiliyor. Hele senin gibi histogram bakıp "yahu bu neden böyle?" diyorsan, orada algoritmanın limitlerini görüyorsun demektir.

Tüm Reklamları Kapat

Bir örnek vereyim, mesela şu kodu düşün:

import random
import matplotlib.pyplot as plt

numbers = [random.randint(4, 10) for _ in range(2000)]

# Sayıları say
count_dict = {i: numbers.count(i) for i in range(4, 11)}

print("Sayıların dağılımı:")
for num, count in count_dict.items():
print(f"{num}: {count} kez")

# Histogram çiz
plt.hist(numbers, bins=range(4, 12), edgecolor='black', align='left', rwidth=0.8)
plt.title("Python random.randint ile üretilen sayılar (4-10)")
plt.xlabel("Sayı")
plt.ylabel("Frekans")
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Bu kodda 2000 sayı üretip hem ekrana kaç kere geldiklerini yazdırıyoruz hem de histogramla görselleştiriyoruz.

Bu sayıları alıp histogram yapınca teoride 4 ile 10 arasında (yani 7 tane sayı) eşit sayıda dağılmış olmasını bekliyoruz, değil mi? Her sayıdan yaklaşık 2000 / 7 ≈ 285 civarında olmalı. Ama işte bazen 260 çıkıyor, bazen 310. Bu ufak oynama, algoritmanın doğasından kaynaklı. Üstelik randint fonksiyonunun nasıl sayıları yuvarladığı, hangi aralıkta nasıl ağırlık verdiği gibi konular da işin içine giriyor.

Üniform dağılım testi de burada devreye giriyor. Bu test aslında "her sayı eşit olasılıkla geliyor mu?" diye bakıyor. Eğer test başarısız olduysa, muhtemelen ya örnek sayısı az geldi ya da algoritma o aralıkta gerçekten pek düzgün çalışmadı. Ama bak, burada şu da önemli: 2000 sayı bazen istatistiksel olarak yeterli olmayabilir. Tesadüfen dengesizlik olabilir. 2000 küçük bir örnek değil ama yine de, "gürültü" olabilir. O yüzden bazen bu testler çok daha büyük sayılarda yapılır.

Ama diyelim ki senin testin çok sağlam ve hakikaten düzgün çalışmadıysa... Bunun nedeni birkaç şey olabilir:

Tüm Reklamları Kapat

  1. Mersenne Twister algoritması bazı aralıklarda küçük sapmalar gösterebilir.
  2. randint fonksiyonu altında yatan hesaplama ufak bias (sapma) yaratıyor olabilir.
  3. NumPy gibi kütüphanelerde bile bazen rastgelelik daha iyi optimize edilir, Python’un random modülü biraz daha basit kalabilir.

Peki çözüm? Yani “daha iyi nasıl rastgele sayı elde ederim” diyorsan...

İki yol var:

Eğer kripto seviyesinde daha “gerçek” rastgelelik istersen, Python’da secrets modülü var. Bu modül daha güçlü, özellikle güvenlik amaçlı kullanılıyor. Ama biraz yavaş.

Bu modül normalde güvenlik işleri için ama dağılım açısından yine iş görür. Fakat biraz daha “yavaş çalışır.” Üretim süresi fark edilebilir.
import secrets
import matplotlib.pyplot as plt
from collections import Counter

numbers = [secrets.randbelow(7) + 4 for _ in range(2000)]

count_dict = Counter(numbers)

print("secrets modülüyle üretilen sayıların dağılımı:")
for num in range(4, 11):
print(f"{num}: {count_dict[num]} kez")

plt.hist(numbers, bins=range(4, 12), edgecolor='black', align='left', rwidth=0.8, color='green')
plt.title("secrets.randbelow ile üretilen sayılar (4-10)")
plt.xlabel("Sayı")
plt.ylabel("Frekans")
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
  1. Eğer çok büyük ölçekli rastgelelik gerekiyorsa, fiziksel rastgelelik devreye giriyor. Mesela bazı sistemler ortam gürültüsünden, CPU’nun sıcaklık değişiminden ya da kuantum olaylardan veri çekerek rastgelelik üretir. Bu iş artık çok ileri seviye. Ama Python'da buna yaklaşmak için os.urandom gibi şeyler var.
  2. Daha kontrollü ve bilimsel işler için NumPy önerilir. Çünkü NumPy’in random modülü (numpy.random) biraz daha optimize çalışır. Üstelik dağılımları da test etmek kolaydır.
import numpy as np
import matplotlib.pyplot as plt

numbers = np.random.randint(4, 11, size=2000)

unique, counts = np.unique(numbers, return_counts=True)
print("NumPy ile üretilen sayıların dağılımı:")
for num, count in zip(unique, counts):
print(f"{num}: {count} kez")

plt.hist(numbers, bins=range(4, 12), edgecolor='black', align='left', rwidth=0.8, color='orange')
plt.title("NumPy randint ile üretilen sayılar (4-10)")
plt.xlabel("Sayı")
plt.ylabel("Frekans")
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Burada genelde dağılım daha düzgün olur. Sayılar arasında fark olabilir ama “göze batar” bir dengesizlik nadiren çıkar. NumPy bu işi biraz daha “ince işçilik” gibi yapıyor.

Sonuç olarak, Python’daki rastgelelik "iyi ama mükemmel değil." Çoğu iş için yeterli ama senin gibi detaylı bakan gözler varsa, bazı şeyler batabilir. O zaman da ya örnek sayısını büyütmek gerek ya da daha kaliteli algoritmalar kullanmak gerek.

Ve evet, rastgelelik işinde biraz tuhaflık hissediyorsan, yalnız değilsin. Çok kişi o histogramları görünce "bu niye böyle?" diye takılıyor. Gerçek rastgelelik bazen düzensiz görünüp daha rastgeledir, bazen de düzenli bir şey görünce şüpheleniriz ama o rastgele olabilir. İşte bu kafa karışıklığı olayın en tatlı kısmı. :)

Kullanılan sayıların rastgelelik durumlarını analiz edebilmek için Chi-squared testini de kullanabilirsin. Grafikleri yorumlamanı kolaylaştıracaktır.

Bu cevap, soru sahibi tarafından en iyi cevap seçilmiştir. Ancak bu, cevabın doğru olduğunu garanti etmez.
5
  • Şikayet Et
  • Mantık Hatası
0
  • Paylaş
  • Alıntıla
  • Alıntıları Göster
Əli Fərzəliyev
bilim delisi 1 ay önce

Pyhtondakı rasgele rakam oluşan komuta ben olsam çok güvenmem çünki biz random komutu ile rasgelelikten çok uzak sayılan işlemci ile rasgele sinyal üretmeye çalışıyoruz.Onun yerine doğadakı belirli rasgelelikleri kullanıp sensörle ölçüp koda vermek daha mantıklı hatta bir şirket rasgele sinyal üretmek için lav lambası kullanıyordu amma bu sadece bilgesayar ile rasgele rakamlar üretemeyiz demek değil piyi kullanan bazı denklemleri pyhtonda çalıştırmak bize resgele sonuçlar vere bilir.

1
  • Şikayet Et
  • Mantık Hatası
0
  • Paylaş
  • Alıntıla
  • Alıntıları Göster
Daha Fazla Cevap Göster
Cevap Ver
Evrim Ağacı Soru & Cevap Platformu, Türkiye'deki bilimseverler tarafından kolektif ve öz denetime dayalı bir şekilde sürdürülen, özgür bir ortamdır. Evrim Ağacı tarafından yayınlanan makalelerin aksine, bu platforma girilen soru ve cevapların içeriği veya gerçek/doğru olup olmadıkları Evrim Ağacı yönetimi tarafından denetlenmemektedir. Evrim Ağacı, bu platformda yayınlanan cevapları herhangi bir şekilde desteklememekte veya doğruluğunu garanti etmemektedir. Doğru olmadığını düşündüğünüz cevapları, size sunulan denetim araçlarıyla işaretleyebilir, daha doğru olan cevapları kaynaklarıyla girebilir ve oylama araçlarıyla platformun daha güvenilir bir ortama evrimleşmesine katkı sağlayabilirsiniz.
Popüler Yazılar
30 gün
90 gün
1 yıl
Evrim Ağacı'na Destek Ol

Evrim Ağacı'nın %100 okur destekli bir bilim platformu olduğunu biliyor muydunuz? Evrim Ağacı'nın maddi destekçileri arasına katılarak Türkiye'de bilimin yayılmasına güç katın.

Evrim Ağacı'nı Takip Et!
Aklımdan Geçen
Komünite Seç
Aklımdan Geçen
Fark Ettim ki...
Bugün Öğrendim ki...
İşe Yarar İpucu
Bilim Haberleri
Hikaye Fikri
Video Konu Önerisi
Başlık
Bugün Türkiye'de bilime ve bilim okuryazarlığına neler katacaksın?
Gündem
Bağlantı
Ekle
Soru Sor
Stiller
Kurallar
Komünite Kuralları
Bu komünite, aklınızdan geçen düşünceleri Evrim Ağacı ailesiyle paylaşabilmeniz içindir. Yapacağınız paylaşımlar Evrim Ağacı'nın kurallarına tabidir. Ayrıca bu komünitenin ek kurallarına da uymanız gerekmektedir.
1
Bilim kimliğinizi önceleyin.
Evrim Ağacı bir bilim platformudur. Dolayısıyla aklınızdan geçen her şeyden ziyade, bilim veya yaşamla ilgili olabilecek düşüncelerinizle ilgileniyoruz.
2
Propaganda ve baskı amaçlı kullanmayın.
Herkesin aklından her şey geçebilir; fakat bu platformun amacı, insanların belli ideolojiler için propaganda yapmaları veya başkaları üzerinde baskı kurma amacıyla geliştirilmemiştir. Paylaştığınız fikirlerin değer kattığından emin olun.
3
Gerilim yaratmayın.
Gerilim, tersleme, tahrik, taciz, alay, dedikodu, trollük, vurdumduymazlık, duyarsızlık, ırkçılık, bağnazlık, nefret söylemi, azınlıklara saldırı, fanatizm, holiganlık, sloganlar yasaktır.
4
Değer katın; hassas konulardan ve öznel yoruma açık alanlardan uzak durun.
Bu komünitenin amacı okurlara hayatla ilgili keyifli farkındalıklar yaşatabilmektir. Din, politika, spor, aktüel konular gibi anlık tepkilere neden olabilecek konulardaki tespitlerden kaçının. Ayrıca aklınızdan geçenlerin Türkiye’deki bilim komünitesine değer katması beklenmektedir.
5
Cevap hakkı doğurmayın.
Aklınızdan geçenlerin bu platformda bulunmuyor olabilecek kişilere cevap hakkı doğurmadığından emin olun.

Bize Ulaşın

ve seni takip ediyor

Göster

Şifremi unuttum Üyelik Aktivasyonu

Göster

Şifrenizi mi unuttunuz? Lütfen e-posta adresinizi giriniz. E-posta adresinize şifrenizi sıfırlamak için bir bağlantı gönderilecektir.

Geri dön

Eğer aktivasyon kodunu almadıysanız lütfen e-posta adresinizi giriniz. Üyeliğinizi aktive etmek için e-posta adresinize bir bağlantı gönderilecektir.

Geri dön

Close