Tüm Platformlar için Hızlı Uygulama Geliştirme Kitabı... Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Rastgele Sayı Üretme Bilmece
#1
Question 
Merhaba

Rastgele sayı üretme ile ilgili ufak bir soru hazırladım. Umarım beğenirsiniz.
Aşağıdaki devre şemasında gösterildiği gibi, bir birin eşi olan iki sistem var, bunlar  START düğmesine basıldığında aynı anda çalışmaya başlıyorlar ve onar adet rastgele sayı üretiyorlar. Her üretilen sayı kendilerine bağlı terminal ekranına yazdırılıyor.


Üretilen sayı dizileri hakkındaki tahminleriniz veya yorumlarınız nedir?

Puan verme limitim +4 olduğu için büyük ödül +4 puansmile.png

MCU da çalışan Kod parçası (aslında tamamı)
void main()
{
int i = 0;
int16 re;

  srand(60); // Delphi deki Randomize; eşdeğeri

  while(i < 10)
  {
     re = rand(); // 0..32767 arasında rastgele sayı üretir
     i++;
     printf("%02u - %05lu\r\n", i,re); // cevap için
     //printf("%02u - ?????\r\n", i);    // soru için
  }

}

Devre şeması:

lbrkVQ.jpg
Cevapla
#2
İki sisteminde random sayilari ayni olur Smile ama sayilar ne olur bilemiyorum
Topluluk mopluluk yok :/
Cevapla
#3
srand(60) sabitesi aynı olduğu için 10 sayı kendi içinde farklı ama (sorunuzun cevabı) bütün 10 sayılık diziler aynı olur.srand(time(0)) olursa mesele hallolur.
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla
#4
@boreas ve @savasbd arkadaşlarımız doğru cevabı vermiş oldular kendilerine teşekkür ederim.


Yukarıdaki örnekte  tüm eş devreler aynı sonuçları üretirler.  Tekrar tekrar çalıştırdığımızda yine sonuçların değişmediğini görürüz.

Rastgele sayı üretme ilginç bir konu aslında. Bir bakıma günümüzde kullandığımız klasik bilgisayar ve programlama alt yapısı ile çelişen bir durum gibi görünüyor. Sayı üretme fonksiyonuna hangi değeri verdiğimizde sonucun ne olacağını biliyoruz.
O zaman sayı üretme  fonksiyon giriş parametresini nasıl "rastgele" yapabiliriz ?

Yöntemlerden birisi, işletim sistemindeki bazı parametreleri ( zaman, işlemci yükü.. vb) kullanmak
Diğer yöntem ise donanımsal rastgele sayı üreten chipler kullanmak. Bu chipler, beyaz gürültü üretme, çok ufak aralıklardaki sıcaklık değişimlerine duyarlılık, çevredeki elektronmanyetik gürültü kaynaklarını işin içine dahil etme gibi yetenekleri ile "rastgele" şartlarını sağlamış olurlar.


Ek not: Delphideki system.pas içindeki randomize fonksiyonu QueryPerformanceCounter, GetTickCount değerlerini kullanmaktadır.


procedure Randomize;
{$IFDEF MSWINDOWS}
var
  Counter: Int64;
begin
  if QueryPerformanceCounter(Counter) then
    RandSeed := Counter
  else
    RandSeed := GetTickCount;
end;
{$ENDIF MSWINDOWS}


// Random integer, implemented as a deterministic linear congruential generator
// with 134775813 as a and 1 as c.
function Random(const ARange: Integer): Integer;
{$IFDEF PUREPASCAL}
var
 Temp: Integer;
begin
 Temp := RandSeed * $08088405 + 1;
 RandSeed := Temp;
 Result := (UInt64(Cardinal(ARange)) * UInt64(Cardinal(Temp))) shr 32;
end;
{$ELSE !PUREPASCAL}
Cevapla
#5
ayrıca buraya bakılmasında fayda var
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Örnek siz boyu 1.40 ile 2.10 arasında 10000 tane insan generate edeceksiniz burada boy kısmını hazırda ki random fonksiyonu ile yapacak olursak her boydan eşit dağılıma yakınsar ama gerçek hayata durum böyle değil ortada dağılım oranı daha yüksek.
seed (tohum) değerine gelecek olursak ne kadar iyi set edilmiş seed değeri o kadar iyi rastgele sonuç.

“Do. Or do not. There is no try.”
Cevapla
#6
Aslında bu problem matematikçilerin ilgi alanına giriyor ve bu konuda çeşitli yaklaşımlar ortaya konulmuş.  Biz yazılımcıları bu yaklaşımları kod dünyasına taşımak ve kullanma kısmı ilgilendiriyor Smile

Bazı durumlarda seçilen aralıkta homojen bir yakınsama olması tercih edilir, ama insan örneğine bunu uyguladığımız zaman sizinde belirttiğiniz gibi gerçek dünya ile uyumsuz hale gelir.  

Hangi yaklaşım modeli kullanıldığından ziyade, modeli seed eden değerin, gerçek dünyadaki bağlantısına (gerçekten rastgele bir olaya bağlantısının önemine)  dikkati çekmek istemiştim.
Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi