Beyin Fırtınası İçin Soru (Yazılım/Matematik)
-
İş mülakatında yeni mezun yazılımcılara sorulan bir soru.
Soru;
Kodlamadan ve dilden bağımsız olarak, Elimizde 3 tane rastgele sayı üreten (pseudorandom number generator-PRNG) kütüphane var.
Bunlardan rastgele sayı üretmesini istediğimizde üretiyor fakat bunların gerçekten rastgele sayı üretip üretmediklerini bilmiyoruz. Hatalıda olabilirler.
Bu kütüphaneleri nasıl test edebilir ve gerçek olanı bulabiliriz. -
"Rastgele" ve "gercekten rastgele" kavramlarını biraz daha açabilir misin?
Kriter mi var?
-
ontedi bunu yazdı
"Rastgele" ve "gercekten rastgele" kavramlarını biraz daha açabilir misin?
Kriter mi var?
Şimdi bilgisayarlarda gerçek rastgele diye bir kavram yok aslen. Bir takım matematik formulleriyle bu değerleri üretirler. Bilgisayar (ve Tanrı) zar atmaz :)
Onun için bunlara başında pseudo (sözde/yalancı) eki alır. C#, pyhton, java gibi tamamında ve bütün OS'larda bir rasgele sayı üretici bulunur ve işlerinide gayet iyi yaparlar.Peki bunun rastgele olup olmadığını nasıl anlarsın?
-
İlk aklıma gelen şey şu oldu.
mesela 3 kütüphane de 1 ile 20 arasında sayı üretsin. İlk kütüphane sayı ürettiğinde mesela 16, diğer kütüphanelerin 16'yı tekrar üretmemesini beklerim. Bu biraz daha gerçeklik katar diye düşünüyorum.
-
cukurova bunu yazdıontedi bunu yazdı
"Rastgele" ve "gercekten rastgele" kavramlarını biraz daha açabilir misin?
Kriter mi var?
Şimdi bilgisayarlarda gerçek rastgele diye bir kavram yok aslen. Bir takım matematik formulleriyle bu değerleri üretirler. Bilgisayar (ve Tanrı) zar atmaz :)
Onun için bunlara başında pseudo (sözde/yalancı) eki alır. C#, pyhton, java gibi tamamında ve bütün OS'larda bir rasgele sayı üretici bulunur ve işlerinide gayet iyi yaparlar.Peki bunun rastgele olup olmadığını nasıl anlarsın?
Okuldaki dersten hatırladığım kadarıyla, rastgele sayı üretmek için en önemli kaynak bilgisayarın saati oluyor. Hatta ödev felanda verilmişti o zamanlar, monte karlo yöntemi felan, da ben pek hatırlamıyorum.
Zaman noktasında aynı anda çalışacak şekilde farklı makinelerden aynı anda rastgele sayı üretmesi istendiğinde aynı sayıları veriyorsa rastgele değildir, diyebilir miyiz hocam?
-
1 ile 10 arasında olacak şekilde çokça rastgele sayı ürettiririm çıkan sonuçta her sayının gelme oranı birbirine yakın ise rastgeledir. Rastgele attığımız sayı yükseldikçe oranlar birbirine dahada yakınlaşır
-
TheAvenqer bunu yazdı
1 ile 10 arasında olacak şekilde çokça rastgele sayı ürettiririm çıkan sonuçta her sayının gelme oranı birbirine yakın ise rastgeledir. Rastgele attığımız sayı yükseldikçe oranlar birbirine dahada yakınlaşır
Hocam başta bende bunu düşündüm ama sıralı üretse sizin dediğiniz oran sağlanmış oluyor ve rasgeleliğ sağlamıyor aslında.
-
İlk aklıma gelen 1.000.000 gibi yüksek bir sayıda 1 ile 10 arası sayılar üretip olasılık dağılımlarını incelemek. Olasılık dağılım grafiğine uymayan dizi sayısı rastgele değil derdim fakat biliyorum ki buda soruya %100 bir cevap olamaz. Düşününce insanda rastgele sayı üretebilir. Kasıtlı olarak hep aynı sayıyı ya da sayı dizinini söylemezse.
hypnot1c tarafından 03/Kas/23 09:32 tarihinde düzenlenmiştir -
1 ile 1 arasında sayı ürettiririm, hata veriyolarsa rastgeledir :D
-
Tebrikler 👏👏👏
Aslında soru tamamen matematik, soruyu "bir zarın veya bir bozuk paranın (yazı-tura) hileli olup olmadığını nasıl anlarsınız?" olarak değiştirsem çok daha net olabilirdi.
Cevap; Büyük sayılar yasası (kumarhanede neden her zaman kasanın kazandığını açıklayan yasa)
Mesela; 1 milyon kez yazı/tura attırırım. Çıkan sonuçların %50-%50 yakın olması gerekir.
veya 1 ile 10 arası 1 milyon kez rastgele sayı ürettirirsiniz, 1M/10 = 100k olacağı için her sayının 100k yakın değerlerde çıkmış olmasını beklersiniz. Arada sapma payı her zaman olacaktır.Hızlıca py kendi random generator kullanarak bir örnek vermek gerekirse;
import random liste = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] defa_dene = 1000000 for i in range(defa_dene): x = random.randint(1, 10) liste[x-1] += 1 for i in range(len(liste)): print(i+1, "sayisi = ", "{:,}".format(liste[i]), "kez geldi", ">>>> Beklenen oran %10 =>", '{:.2f}%'.format(liste[i]/defa_dene*100))
Çıktı ;
1 sayisi = 100,034 kez geldi >>>> Beklenen oran %10 => 10.00%
2 sayisi = 99,432 kez geldi >>>> Beklenen oran %10 => 9.94%
3 sayisi = 100,069 kez geldi >>>> Beklenen oran %10 => 10.01%
4 sayisi = 100,210 kez geldi >>>> Beklenen oran %10 => 10.02%
5 sayisi = 99,855 kez geldi >>>> Beklenen oran %10 => 9.99%
6 sayisi = 100,366 kez geldi >>>> Beklenen oran %10 => 10.04%
7 sayisi = 100,314 kez geldi >>>> Beklenen oran %10 => 10.03%
8 sayisi = 99,946 kez geldi >>>> Beklenen oran %10 => 9.99%
9 sayisi = 99,619 kez geldi >>>> Beklenen oran %10 => 9.96%
10 sayisi = 100,155 kez geldi >>>> Beklenen oran %10 => 10.02% -
cukurova bunu yazdı
Tebrikler 👏👏👏
Aslında soru tamamen matematik, soruyu "bir zarın veya bir bozuk paranın (yazı-tura) hileli olup olmadığını nasıl anlarsınız?" olarak değiştirsem çok daha net olabilirdi.
Cevap; Büyük sayılar yasası (kumarhanede neden her zaman kasanın kazandığını açıklayan yasa)
Mesela; 1 milyon kez yazı/tura attırırım. Çıkan sonuçların %50-%50 yakın olması gerekir.
veya 1 ile 10 arası 1 milyon kez rastgele sayı ürettirirsiniz, 1M/10 = 100k olacağı için her sayının 100k yakın değerlerde çıkmış olmasını beklersiniz. Arada sapma payı her zaman olacaktır.Hızlıca py kendi random generator kullanarak bir örnek vermek gerekirse;
import random liste = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] defa_dene = 1000000 for i in range(defa_dene): x = random.randint(1, 10) liste[x-1] += 1 for i in range(len(liste)): print(i+1, "sayisi = ", "{:,}".format(liste[i]), "kez geldi", ">>>> Beklenen oran %10 =>", '{:.2f}%'.format(liste[i]/defa_dene*100))
Çıktı ;
1 sayisi = 100,034 kez geldi >>>> Beklenen oran %10 => 10.00%
2 sayisi = 99,432 kez geldi >>>> Beklenen oran %10 => 9.94%
3 sayisi = 100,069 kez geldi >>>> Beklenen oran %10 => 10.01%
4 sayisi = 100,210 kez geldi >>>> Beklenen oran %10 => 10.02%
5 sayisi = 99,855 kez geldi >>>> Beklenen oran %10 => 9.99%
6 sayisi = 100,366 kez geldi >>>> Beklenen oran %10 => 10.04%
7 sayisi = 100,314 kez geldi >>>> Beklenen oran %10 => 10.03%
8 sayisi = 99,946 kez geldi >>>> Beklenen oran %10 => 9.99%
9 sayisi = 99,619 kez geldi >>>> Beklenen oran %10 => 9.96%
10 sayisi = 100,155 kez geldi >>>> Beklenen oran %10 => 10.02%Bu yeterli mi
Örnek kodunu bir mikroişlemcide çalıştırdım.
Çıkan sonuç:
1-99839
2-100670
3-100147
4-100262
5-99858
6-100219
7-99499
8-99900
9-99518
10-100088
Oranlar %10'a yakın, senin tanımına göre gerçekten rastgele. Mikroişlemciyi resetledim kodu tekrar çalıştırdım
2. sonuç:
1-99839
2-100670
3-100147
4-100262
5-99858
6-100219
7-99499
8-99900
9-99518
10-100088İkinci sonuca bakınca "gerçekten rastgele" değil. Tabi bu "gerçekten rastgele" tanımına göre değişir.