April 19, 2012

Sadece 10 satır daha ekleyerek std.concurrency sınıfını by-pass ettim. Bunun için değişkenleri ve yardımcı işlevleri TEST sınıfı içine almak gerekiyor. Böylece core.Thread sorunsuz çalıştığı gibi paylaşım (shared) olayından kurtuluyoruz. Ancak 'send()' işlevi yerine 'birYapı{}''da sonuGeldi_mi Boolean değişkenine ihtiyaç duydum. Netice sanki biraz farklı ve uzaklaşma hızlı:

/*
   sleepTest2t.d (19.04.2012)
*/

import core.thread;
import std.random, std.stdio: writeln;

class TEST {
   public this(int birSayı, int ikiSayı) {
       birincinin.Beklemesi = birSayı;
       ikincinin.Beklemesi = ikiSayı;
   }

   private struct birYapı {
       int Sayımı, Beklemesi;
       bool sonuGeldi_mi = false;
   } birYapı birincinin, ikincinin;

   public void bir () { auto Tbir = new Thread(&birinci); Tbir.start(); }

   public void iki () { auto Tiki = new Thread(&ikinci); Tiki.start(); }

   private void birinci () {
       scope(exit) {
           writeln(" - birinci() x ", ++birincinin.Sayımı, " kez girdi...");
           birincinin.sonuGeldi_mi = true;
       }
       writeln("Ben (1.) birinciyim ve ", birincinin.Beklemesi,
               " saniye beklemeliyim!");

       Thread.sleep(dur!"seconds"(birincinin.Beklemesi));
   }

   private void ikinci () {
       scope(exit) {
           writeln(" - ikinci() x ", ++ikincinin.Sayımı, " kez girdi...");
           ikincinin.sonuGeldi_mi = true;
       }
       writeln("Ben (2.) ikinciyim ve ", ikincinin.Beklemesi,
               " saniye beklemeliyim!");

       Thread.sleep(dur!"seconds"(ikincinin.Beklemesi));
   }
}

void main() {
   auto rasgele = () => uniform(1, 10);
   auto Deneme = new TEST (rasgele(), rasgele());

   Deneme.bir;
   Deneme.iki;

   while (true) {
       if (Deneme.birincinin.sonuGeldi_mi) {
           Deneme.birincinin.sonuGeldi_mi = false;
           Deneme.birincinin.Beklemesi = rasgele();
           Deneme.bir;
       }
       if (Deneme.ikincinin.sonuGeldi_mi) {
           Deneme.ikincinin.sonuGeldi_mi = false;
           Deneme.ikincinin.Beklemesi = rasgele();
           Deneme.iki;
       }
   }
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 19, 2012

Peki öylese şöyle yapalım; Mert de katkı sağlarsa sevinirim...:)

Çünkü bekletme ve eş zamanlı programlama gibi enstürmanlar ile çok kafa karıştırdığımın farkındayım. Aslında işin benzeri aşağıdaki kod olabilir. Tek yapmanız gereken, "randomAnalyze > analyze.csv" şeklinde çalıştırıp Windows için "start analyze.csv" kısayolunda Excel ile açtığınızda grafiği istediğiniz defa görüntüleyebilirsiniz. Tabi çizelgeyi görebilmeniz için tüm veriyi işaretleyip grafik ekleme seçeneklerinie gelmelisiniz. Dikey doğru zamanı, yatay doğru ise alınan örneği (kodda 250) temsil etmektedir. Buraya kadar bahsettiğime benzer veriler üretiyor. Belki cevabı basit bir şey çıkacaktır?

/*
   randomAnalyze.d (19.04.2012)
*/

import std.random, std.stdio;

void main() {
   auto rasgele = () => uniform(1, 10);

   int[] ras1, ras2;
   int xSay1, xSay2;

   int loop = 250;

   while (loop) {
   	ras1 ~= rasgele();
   	ras2 ~= rasgele();
   	loop--;
   }

   writeln("xSay1;xSay2;xFark");

   foreach(r2, r1; ras1) {
   	xSay1 += r1;
   	xSay2 += ras2[r2];
   	//writeln(r1, "/", ras2[r2]);
   	writeln(xSay1, ";", xSay2, ";",
   			xSay1 > xSay2 ?
   			xSay1 - xSay2 :
   			xSay2 - xSay1);
   }
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 19, 2012

Alıntı (Salih Dinçer):

>

Olay aslında basit

Tamam Haziran'da anlaşırız. ;)

Alıntı:

>

rasgele süre (saniye) boyunca 2 işlev (iş parçacağı) çalışıyor.

En başta öyle. O iki iş parçacığı tek mesaj gönderip sonlanıyorlar. O noktadan sonra onların gönderdikleri mesajlar alındıkça diğerinden bir tane daha başlatılıyor.

Yani burada sayısız iş parçacığı başlatılıyor ve sonlanıyor. Her birisi diğerinin başlamasını tetiklediği için de bütün beklemeler bütün iş parçacıklarını etkiliyor.

Yaptığın deneyi daha anlamadım. scope(exit)'in iş parçacıklarında etkisini mi araştırıyorsun?

Alıntı:

>

Bu tek programda (exe'de) her şey normal görünüyor ama iş ikinci bir programı çalıştırdığınızda (etti 4 iş parçacığı)

Artı o sırada sistemde işlemekte olan belki de yüzlerce başka iş parçacığı...

Alıntı:

>

rasgelelikten uzaklaşıp birbirleriyle yakın doğruda (-bknz. önceki sayfadaki çizelge) ilerliyor.

Rasgelelikten uzaklaşmak ne demek acaba? Ayrıca önceki sayfadaki çizelgenin yalnızca tek ekseninin ismi var ve o da neyin farkı olduğunu söylemiyor. Yoksa x ekseni zaman mı olacak?

Alıntı:

>

Yani soruna programcılık mantığıyla değil de biraz bilimsel ve şüpheci mantıkla bakmak gerkiyor;

Onu da göremiyorum. Öncelikle işletim sisteminin yüklenmesi gibi konulardan şüphelenilebilir.

Alıntı:

>
>     Deneme.bir;
>     Deneme.iki;
> ```


Onların iş parçacıkları başlattıklarını anlamam zaman aldı. :) Ben de çoğu programcı gibi iş yapan işlevlerin isimlerinde eylem görmeye alışmışım.

Ali

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
April 19, 2012

Alıntı (acehreli):

>

Ben uniform()'un kullandığı algoritmanın zayıf veya güçlü olduğunu bilmeden yalnızca senin deneyini açıklamaya çalışıyorum: uniform()'un bir atlayan değerlerinin toplamları arasında bir ilişki görebiliyor muyuz? Örneğin acaba tek numaralı değerler ortalamada çift numaralılardan daha mı yüksekler?
Öncelikle tek/çift diye ayırmıyorum, herhalde fark belli olsun diye betimle yapmak istedin? Aslında xSay3'de kullanabilirdik ve bu sonsuz doğruya kadar gidebilir. Başlangıçta iki işlev (iş parçacığı) ile çalıştığımız ve takibi kolay olsun diye iki değişken kullandım. Ayrıca MT algoritmasının güçlü veya zayıf yönlerini araştırmıyorum daha çok karşılaştırıyorum. Hatta bakınız zamana bağlı çok çok basit bir rasgele işlevininin (TickTack algorithm) karşılaştırma sonuçları şöyle:

http://desmond.imageshack.us/Himg841/scaled.php?server=841&filename=randomanalyze.png&res=landing
Orijinali (yüksek kalitelisi) için tıklayınız... (http://img841.imageshack.us/img841/6362/randomanalyze.png)

import core.thread, std.random;
import std.datetime, std.stdio;

void xAdet(size_t loop = 100, size_t range = 10) {
	//auto rasgele = () => uniform(1, range);/*
	auto rasgele = () => Clock.currStdTime() &
               		size_t.max >> ((size_t.sizeof * 8) - range);//*/
	size_t xSay1, xSay2;

	writeln("xSay1;xSay2;xFark");

	for(; loop > 0; loop--) {
		xSay1 += rasgele();
		Thread.sleep(dur!"msecs"(rasgele()));
   	xSay2 += rasgele();
   	Thread.sleep(dur!"msecs"(rasgele()));

   	writeln(xSay1, ";", xSay2, ";",
   			xSay1 > xSay2 ?
   			xSay1 - xSay2 :
   			xSay2 - xSay1);
	}
}

void main() {
	xAdet ();
}

Belki de bu başlığı değiştirmeliyiz? Örneğin Random Test Algorithm şeklinde...

Başa dönersek; spawn() kullandığımızda rasgele giden iki doğru parçasının biribirine çok yakın seyrettiğini tespit ettim. Bunun nedenini araştırmaya çalıştım ve zannedersem algoritmanın Flip/Flop mantığından kaynaklanıyor. Çünkü kodu rasgele sayı üreten algoritmaya doğru sadeleştirdiğimde doğru parçalarındaki uzaklaşmanın arttığını gördüm.

Özetle bu sonuçlar bana hala ilginç geliyor..:)

Eş zamanlı programlamadan çok rasgeleliği anlamaya çalıştığım basit bir çalışmaydı. İlgilenen herkese teşekkür ederim...

Dip Not: Koddaki 'Thread.sleep()' işlevini kullanmamın sebebi, kendi yazdığım rasgele algoritmasının o an ki tiktak sayacının son bir kaç rakamını almasından kaynaklanıyor. Bilgisayarlarımız çok hızlı olduğundan ve başka kodlamalar ile zaman kaybetmemek için basitçe programı üretilen sayı kadar uyuttum...:)

Sevgiler, saygılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 19, 2012

Yani uniform()'un ürettiği sayıları birer atlayarak farklı iki değişkende topluyorsun. Bir anlamda çift numaralı rasgele değerleri xSay1'de, tek numaralıları xSay2'de biriktiriyorsun.

uniform() sözde (pseudo) rasgele değerler üretir. Bu tür algoritmalar birr çok önemli konuda belirli ölçülerde ödünler verirler. Her algoritmanın zayıf ve güçlü olduğu taraflar vardır.

Ben uniform()'un kullandığı algoritmanın zayıf veya güçlü olduğunu bilmeden yalnızca senin deneyini açıklamaya çalışıyorum: uniform()'un bir atlayan değerlerinin toplamları arasında bir ilişki görebiliyor muyuz? Örneğin acaba tek numaralı değerler ortalamada çift numaralılardan daha mı yüksekler?

Kullanacağı algoritma uniform()'a bildirilmediği zaman Random'u kullanıyormuş. O da her platforma en uygun olan algoritmaymış. Ben std.random'da şu satırı görüyorum:

alias Mt19937 Random;

O da daha yukarıda şöyle tanımlı:

alias MersenneTwisterEngine!(uint, 32, 624, 397, 31, 0x9908b0df, 11, 7,
                            0x9d2c5680, 15, 0xefc60000, 18)
   Mt19937;

Senin soruna dönersek, eğer Mersenne Twister varsayıldığı gibi çok iyi bir algotirmaysa, ben toplamlar arasındaki farkın örnek adedine bölümünün gittikçe sıfıra yaklaşacağını beklerim. Yani farkın değeri değil, örnek adedine bölümü önemli. Örnek adedi arttıkça toplamlar gittikçe birbirlerine yaklaşacaklar (bağıl olarak). Aradaki fark zamanla artacak, azalacak, sıfırın öteki tarafına geçecek, ve aslında kendisi de rasgele bir davranış gösterecek.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 20, 2012

Anladım hocam, yani

size_t index = 0; // ise

Her çift sayıdan sonrası xSay[index+1] tekli grubu yazılımsal olarak temsil ettiğini belirtmişsin. Peki gerçek hayattan örnek versem her iki grubunda birbiri ile alakalı olmaması gerektiğini gösterebilir miyim...

Çok yoğun bir iş hanının kapısından (örn. Sirkeci Doğubank), açıldığı ilk saat 19 kişi (müşteri, satıcı) yaya olarak girse, aynı saat diliminde mal teslim bölümüne de 23 araç geçse, bu birbiriyle alakalı görünse de bağımsız iki rasgeleliği temsil ettiğini düşünebiliriz. Çünkü yük kamyonları trafiğin tüm unsurlarından etkilenmekte. Bunun gün boyu şöyle devam ettiğini öngörsek:

'iş hanı / mal teslim
19, 23
33, 21
41, 11
., ..'

Sonuçta bu iki farklı veri, aşağıdaki xOrt. ile temsil edilen çizgi yakınlarında dolaşmalıdır diyebiliriz:

http://img862.imageshack.us/img862/1782/rasgeleortalama.png

Neyse arkadaşlar, elin yabanacıları atı değil Ar Drone'ı (-bknz. yeni nesil Quadricopter (http://youtu.be/2Kk-l4rVYQA)) almış, Üsküdar'ı değil cihanı geçmiş ben hala rasgeleliği anlamaya çalışıyorum...:D

CES 2012'de tanıtılan bu ürün, her türlü iPad ve Android benzeri cihaz ile kontrol edilebiliyor. Üzerindeki kameradan görüntü alınabiliyor ve hatta havada takla (vidyoda yapmışlar!) bile atabiliyor. Fiyatı ~300$ imiş ve Parrot üretimi. Tüm aksamı bildiğiniz strafor denilen EPP (polypropylene) malzemeden yapmışlar. Ucuz, sağlam ve hepsinden önemlisi hafif bir malzeme. Bizim bisiklet kaskları da bundan yapılıyor.

Bir taraftan Google boş durmuyor yeni diller, uygulamalar geliştiriyor. Şu Üsküdar'a giden at nerede satılır acaba gidip alsak. En azından Türk atasının silah gibi başından eksik etmediği şu ulaşım aracıyla yetişsek! Yetişemez miyiz? Sanırım çok okur ve çalışırsak mümkün...:)

Sevgiler, saygılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 19, 2012

Alıntı (Salih Dinçer):

>

Öncelikle tek/çift diye ayırmıyorum, herhalde fark belli olsun diye betimle yapmak istedin?

Rasgele sayının tekliği veya çiftliği değil de rasgele sayıların tek numaralıları ve çift numaralıları demek istedim. Yani rasgele sayı dizisindeki sıra numaralarının tekliği/çiftliği... Dizi uniform() tarafından a,b,c,d,... diye üretiliyorsa sen a+c+... ve b+d+... toplamlarına bakıyorsun.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

1 2 3
Next ›   Last »