﻿
{"id":8155,"date":"2018-06-04T13:01:26","date_gmt":"2018-06-04T13:01:26","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=8155"},"modified":"2018-06-04T13:07:04","modified_gmt":"2018-06-04T13:07:04","slug":"cta-rastgele-sayi-uretimi-sorunsali","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-rastgele-sayi-uretimi-sorunsali\/","title":{"rendered":"C#&#8217;ta Rastgele Say\u0131 \u00dcretimi Sorunsal\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Yaz\u0131l\u0131m olgusu, bilgisayara kullan\u0131c\u0131n\u0131n iste\u011fi do\u011frultusunda algoritmik bir senfoni e\u015fli\u011finde komutlar ile taleplerde bulunulan ve bu taleplere kar\u015f\u0131 verilen cevaplara yahut olaylar\u0131n gidi\u015fat\u0131 kontrol\u00fcnde beklenen durumlara g\u00f6re s\u00fcreci amaca uygun bir \u015fekilde i\u015fleterek bir veriyi do\u011fru ve beklendi\u011fi \u015fekilde i\u015fleyebilme durumudur. Evet, olaya biraz kuramsal yakla\u015fmak istemi\u015f olabilirim. Ama bu yakla\u015f\u0131m\u0131n ard\u0131ndan bilgisayar denen ayg\u0131t\u0131n hala g\u00fcn\u00fcm\u00fczde rastgele bir say\u0131 \u00fcretecek kadar geli\u015fmemi\u015f olmas\u0131 ger\u00e7e\u011fi ise bu giri\u015fi san\u0131r\u0131m olduk\u00e7a trajikomik bir hale getirmektedir.<\/p>\n<p>Yaz\u0131l\u0131mlar insanlar\u0131n yahut belirli makinelerin ihtiya\u00e7lar\u0131na cevap verebilecek donan\u0131m\u0131 kendilerinde dolayl\u0131 yoldan bar\u0131nd\u0131rabilirken, bu yaz\u0131l\u0131m\u0131 kullanan ve kendine o anl\u0131k zihinsel karar mekanizmas\u0131 olarak tan\u0131yan bilgisayar denen ayg\u0131t nas\u0131l oluyor da bir rastgele say\u0131 \u00fcretebilecek kapasitede olam\u0131yor \u015fa\u015f\u0131lacak \u015fey de\u011fil!<\/p>\n<p>Evet, piyasada dolanan sorulara istinaden kaleme(<span style=\"font-size:10px;\">do\u011frusu klavyeye<\/span>) alm\u0131\u015f oldu\u011fum bu makalemizde rastgele say\u0131 \u00fcretimi \u00fczerine hala fikir birli\u011fine var\u0131lamayan birka\u00e7 husus \u00fczerine elden geldi\u011fince ayd\u0131nlat\u0131c\u0131 bir teori ve a\u00e7\u0131klamada bulunaca\u011f\u0131m&#8230;<\/p>\n<p>Tabi \u00f6ncelikle bir bilgisayarda, haz\u0131r Random s\u0131n\u0131f\u0131 olmasayd\u0131 nas\u0131l rastgele say\u0131 \u00fcretebiliriz bu durum \u00fczerine isti\u015fare etmekte fayda g\u00f6r\u00fcyorum.<\/p>\n<p>\u015eimdilik akl\u0131ma iki ama etkili y\u00f6ntem gelmektedir.<\/p>\n<p>Bunlardan birincisi, rastgele \u00fcretilecek say\u0131lar\u0131 \u00f6nceden bir koleksiyon i\u00e7erisinde tutarak istendi\u011fi zaman bunlardan herhangi birini istemciye g\u00f6ndermek olabilirdi. Biliyorum \u00e7ok vasat ama etkili ve net \u00e7\u00f6z\u00fcm \ud83d\ude42<\/p>\n<p>\u0130kinci y\u00f6ntem ise, ba\u011f\u0131nt\u0131s\u0131 olu\u015fturuldu\u011fu zaman muhtemelen bir benzer sonucu \u00fcretemeyecek bilgisayar\u0131n tarihsel verileri \u00fczerinden yap\u0131lacak \u00e7al\u0131\u015fmalar neticesinde \u00fcretilen say\u0131lard\u0131r. \u00d6rne\u011fin; bu g\u00fcn\u00fcn tarihi verilerinden, saat ve milisaniye \u00e7arp\u0131m sonucunu y\u0131la b\u00f6lerek \u00e7\u0131kan sonuca ay de\u011ferinin 3\/4 al\u0131p, karesini eklersek e\u011fer kar\u015f\u0131m\u0131za \u00e7\u0131kan sonucun bir saniye sonra bu i\u015flemin ayn\u0131s\u0131n\u0131 yapt\u0131\u011f\u0131m\u0131zda \u00e7\u0131kan sonu\u00e7la da\u011flar kadar farkl\u0131 oldu\u011funu g\u00f6rebiliriz. \u0130\u015fte size sonsuza denk farkl\u0131 sonuc \u00fcretecek bir algoritma.<\/p>\n<p>Zaten .NET mimarisinde ki Random s\u0131n\u0131f\u0131da sistemdeki tarih bilgilerini kullanarak ortaya rastgele bir say\u0131 \u00fcretmektedir. \u0130\u015fte t\u00fcm meselenin s\u0131rr\u0131 budur. <strong>Hangi meselenin hoca la?<\/strong> Birazdan piyasada dola\u015fan Random say\u0131 \u00fcretimiyle ilgili s\u0131k\u0131nt\u0131lar\u0131 masaya yat\u0131raca\u011f\u0131z. Dolay\u0131s\u0131yla bu s\u0131k\u0131nt\u0131lardan birinin kayna\u011f\u0131 Random s\u0131n\u0131f\u0131n\u0131n sistemdeki tarih bilgisini kullanmas\u0131ndan kaynakland\u0131\u011f\u0131n\u0131 pe\u015finen belirtiyorum.<\/p>\n<p>Velhas\u0131l madem laf\u0131n\u0131 etmi\u015fken ilgili s\u0131k\u0131nt\u0131y\u0131 ilk olarak ele alal\u0131m.<\/p>\n<p><strong>#Soru 1#<\/strong><br \/>\n<em><strong>Random S\u0131n\u0131f\u0131 S\u00fcrekli Ayn\u0131 Say\u0131y\u0131 \u00dcretiyor<\/strong><\/em><br \/>\nBu sorunun temel kayna\u011f\u0131 yukar\u0131da da belirtti\u011fim gibi Random s\u0131n\u0131f\u0131n\u0131n sistemdeki tarih bilgisini kullan\u0131yor olmas\u0131d\u0131r. Bir di\u011fer kayna\u011f\u0131 ise Random s\u0131n\u0131f\u0131n\u0131n kullan\u0131m tarz\u0131d\u0131r. \u015eimdi bu durumlar\u0131 programatik olarak ele alaca\u011f\u0131z;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int counter = 1;\r\n            while (counter &lt; 100)\r\n            {\r\n                Random rst = new Random();\r\n                Console.WriteLine(rst.Next());\r\n                counter++;\r\n            }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funun ekran \u00e7\u0131kt\u0131s\u0131 a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/06\/Cta-Rastgele-Say\u0131-\u00dcretimi-Sorunsal\u0131.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/06\/Cta-Rastgele-Say\u0131-\u00dcretimi-Sorunsal\u0131.png\" alt=\"C#&#039;ta Rastgele Say\u0131 \u00dcretimi Sorunsal\u0131\" width=\"100\" height=\"275\" class=\"aligncenter size-full wp-image-8175\" \/><\/a><br \/>\nEvet&#8230; Kodu ve neticeyi incelersek e\u011fer g\u00f6r\u00fcnen o ki beklenen sonu\u00e7 elde edilememi\u015f ve \u00fcretilen say\u0131lar birbirlerini tekrar eden cinsten art\u0131k rastgele de\u011fil tahmin edilebilir bir vaziyette elde edilir olmu\u015f.<\/p>\n<p>Yukar\u0131da bahsetti\u011fim gibi Random s\u0131n\u0131f\u0131 tarih bilgilerini kullanarak bir de\u011fer \u00fcretmektedir. Dolay\u0131s\u0131yla bu i\u015flemi constructer metoduyla ger\u00e7ekle\u015ftirmektedir. E\u011fer ki Random s\u0131n\u0131f\u0131n\u0131n parametresiz constructer\u0131n\u0131 kullan\u0131rsan\u0131z ilgili s\u0131n\u0131f direkt olarak sistem zaman\u0131n\u0131 de\u011ferlendirecek ve tarihsel bilgilerden bir ba\u011f\u0131nt\u0131 ile rastgele say\u0131 \u00fcretecektir. Ama burada while d\u00f6ng\u00fcs\u00fc zamandan olduk\u00e7a h\u0131zl\u0131 \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan dolay\u0131 s\u00fcrekli ayn\u0131 zaman \u00fczerine odaklan\u0131lacak ve o an ki milisaniye de\u011feri de\u011fi\u015fene denk ayn\u0131 sonu\u00e7 \u00fcretilecektir.<\/p>\n<p>Soruna sebep olan di\u011fer durum ise Random s\u0131n\u0131f\u0131n\u0131 kullan\u0131m tarz\u0131d\u0131r. Dolay\u0131s\u0131yla yukar\u0131daki kullan\u0131m tarz\u0131 her bir d\u00f6ng\u00fcde yeni bir Random nesnesi talep edecek ve izahatte bulundu\u011fumuz hataya sebebiyet verecektir. O halde algoritma in\u015fas\u0131n\u0131 a\u015fa\u011f\u0131daki gibi d\u00fczeltmemiz hatay\u0131 ortadan kald\u0131racakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int counter = 1;\r\n            Random rst = new Random();\r\n            while (counter &lt; 100)\r\n            {\r\n                Console.WriteLine(rst.Next());\r\n                counter++;\r\n            }\r\n<\/pre>\n<p>En nihayetinde Random s\u0131n\u0131f\u0131n\u0131 bir kere \u00fcretip ard\u0131ndan d\u00f6ng\u00fc ile var olan nesne \u00fczerinden rastgele say\u0131 talebinde bulunursak e\u011fer her bir d\u00f6ng\u00fc i\u00e7in farkl\u0131 bir de\u011fer \u00fcretilecektir.<br \/>\nElde edilen sonu\u00e7;<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/06\/Cta-Rastgele-Say\u0131-\u00dcretimi-Sorunsal\u0131-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/06\/Cta-Rastgele-Say\u0131-\u00dcretimi-Sorunsal\u0131-1.png\" alt=\"C#&#039;ta Rastgele Say\u0131 \u00dcretimi Sorunsal\u0131\" width=\"82\" height=\"219\" class=\"aligncenter size-full wp-image-8177\" \/><\/a><\/p>\n<p>Buradan \u00e7\u0131karaca\u011f\u0131m\u0131z sonu\u00e7 Random s\u0131n\u0131f\u0131n\u0131n ba\u015flang\u0131\u00e7 de\u011feri olarak neyi kabul etti\u011fidir. E\u011fer ki, d\u00f6ng\u00fc d\u0131\u015f\u0131nda \u00fcretilen Random nesnesine constructer arac\u0131l\u0131\u011f\u0131yla bir seed de\u011feri verilirse sanki d\u00f6ng\u00fc i\u00e7erisinde s\u00fcrekli ayn\u0131 zaman de\u011ferlerinde \u00fcretilen Random nesnesiymi\u015f gibi yine ayn\u0131 hatayla kar\u015f\u0131la\u015f\u0131lacakt\u0131r. Ama bu sefer \u00fcretilen de\u011ferler farkl\u0131 olsada her periyotta ayn\u0131 olacakt\u0131r.<\/p>\n<p>Anlatmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131 \u00f6rneklendirmek i\u00e7in;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int counter = 1;\r\n            Random rst = new Random(1111);\r\n            while (counter &lt; 10)\r\n            {\r\n                Console.WriteLine(rst.Next() + &quot; &quot;);\r\n                counter++;\r\n            }\r\n<\/pre>\n<p>komutunu iki kere \u00e7al\u0131\u015ft\u0131rmam\u0131z yeterlidir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/06\/Cta-Rastgele-Say\u0131-\u00dcretimi-Sorunsal\u0131.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/06\/Cta-Rastgele-Say\u0131-\u00dcretimi-Sorunsal\u0131.gif\" alt=\"C#&#039;ta Rastgele Say\u0131 \u00dcretimi Sorunsal\u0131\" width=\"600\" height=\"503\" class=\"aligncenter size-full wp-image-8181\" \/><\/a><br \/>\nBu \u015fekilde bir kullan\u0131m ile ard arda \u00e7al\u0131\u015ft\u0131rmalarda s\u00fcrekli ayn\u0131 sonu\u00e7lar\u0131 ald\u0131\u011f\u0131m\u0131z\u0131 g\u00f6r\u00fcyoruz.<\/p>\n<table>\n<thead>\n<tr>\n<th>\n1. \u00c7al\u0131\u015ft\u0131rma\n<\/th>\n<th>\n2. \u00c7al\u0131\u015ft\u0131rma\n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\n302295548<br \/>\n1729603735<br \/>\n738047416<br \/>\n1488758225<br \/>\n1732353655<br \/>\n986442359<br \/>\n1496834943<br \/>\n1747084034<br \/>\n916554424\n<\/td>\n<td>\n302295548<br \/>\n1729603735<br \/>\n738047416<br \/>\n1488758225<br \/>\n1732353655<br \/>\n986442359<br \/>\n1496834943<br \/>\n1747084034<br \/>\n916554424\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Neticede Random s\u0131n\u0131f\u0131, asl\u0131nda rastgele de\u011ferleri sade ve sadece parametresiz constructer\u0131 \u00e7al\u0131\u015ft\u0131r\u0131rken \u00fcretti\u011fini s\u00f6yleyebiliriz. Gerisi, \u00fcretilen ilk say\u0131ya ucundan k\u0131y\u0131s\u0131ndan bir oranda ba\u011fl\u0131 olarak \u00fcretilen say\u0131lard\u0131r diyebiliriz. Bunun d\u0131\u015f\u0131nda parametre olarak seed de\u011feri verildi\u011finde \u00fcretilen say\u0131lar kan\u0131mca s\u0131k\u0131 ve dikkatli bir takiple tahmin edilebilir oldu\u011fu kanaatindeyim.<\/p>\n<p><strong>#Soru 2#<\/strong><br \/>\n<em><strong>Tekrars\u0131z Rastgele Say\u0131 \u00dcretmek \u0130stiyorum<\/strong><\/em><br \/>\nAsl\u0131nda basit bir mant\u0131kta \u00e7\u00f6z\u00fcm \u00fcretebilece\u011fimiz bir sorundur. Yap\u0131lmas\u0131 gereken \u00fcretilen de\u011ferleri bir koleksiyonda toplamak ve \u00f6nceki de\u011ferler aras\u0131nda varsa koleksiyona eklemeksizin yerine yeni de\u011fer \u00fcretip ayn\u0131 kontrol e\u015fli\u011finde tekrar koleksiyona atmak olacakt\u0131r.<\/p>\n<p>Tabi bu i\u015flemi yaparken y\u00f6ntem olarak do\u011fru se\u00e7imde bulunmak olduk\u00e7a kritik arz etmektedir. Nihayetinde milyarlarca say\u0131 i\u00e7in bu i\u015flemi yapt\u0131\u011f\u0131n\u0131z\u0131 d\u00fc\u015f\u00fcn\u00fcrseniz performans ve maliyet a\u00e7\u0131s\u0131ndan l\u00fczumsuz yere bonk\u00f6r davranman\u0131z s\u00f6z konusu olabilir.<\/p>\n<p>Bu tarz i\u015flemlerde HashSet koleksiyon tipini kullanman\u0131z en do\u011frusu olacakt\u0131r.  HashSet koleksiyonunun kulland\u0131\u011f\u0131 kovalama y\u00f6ntemi sayesinde daha performansl\u0131 bir \u015fekilde bu i\u015flemi ger\u00e7ekle\u015ftirebiliriz. Ayriyetten ilgili koleksiyon ISet interfaceini implement etti\u011finden dolay\u0131 yeni \u00fcretilen de\u011feri koleksiyondaki \u00f6nceki de\u011ferlerle k\u0131yaslama gibi bir derdimiz kalmayacakt\u0131r. Nihayetinde ISet interfaceini uygulayan koleksiyonlarda verile unique&#8217;dir ya da bir ba\u015fka deyi\u015fle ayn\u0131 elemandan birden fazla bulunmayacakt\u0131r. Eklenmeye \u00e7al\u0131\u015f\u0131lan eleman koleksiyonda mevcutsa e\u011fer Add metodu false de\u011feri d\u00f6nd\u00fcrecektir.<\/p>\n<p>\u015eimdi gelin bir normal koleksiyon ile bir de HashSet koleksiyonu ile buradaki ihtiyaca d\u00f6n\u00fck i\u015flevlerimizi ger\u00e7ekle\u015ftirelim.<br \/>\nNormal koleksiyon ile;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int counter = 1;\r\n            List&lt;int&gt; sayilar = new List&lt;int&gt;();\r\n            Random rst = new Random();\r\n            while (counter &lt; 100)\r\n            {\r\n                int rstSayi = rst.Next();\r\n                if (!sayilar.Contains(rstSayi))\r\n                    sayilar.Add(rstSayi);\r\n                counter++;\r\n            }\r\n<\/pre>\n<p>HashSet ile;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            int counter = 1;\r\n            HashSet&lt;int&gt; sayilar = new HashSet&lt;int&gt;();\r\n            Random rst = new Random();\r\n            while (counter &lt; 100)\r\n            {\r\n                sayilar.Add(rst.Next());\r\n                counter++;\r\n            }\r\n<\/pre>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Yaz\u0131l\u0131m olgusu, bilgisayara kullan\u0131c\u0131n\u0131n iste\u011fi do\u011frultusunda algoritmik bir senfoni e\u015fli\u011finde komutlar ile taleplerde bulunulan ve bu taleplere kar\u015f\u0131 verilen cevaplara yahut olaylar\u0131n gidi\u015fat\u0131 kontrol\u00fcnde beklenen durumlara g\u00f6re s\u00fcreci amaca uygun bir \u015fekilde i\u015fleterek&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3223,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[2373,2372,2374],"class_list":["post-8155","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","tag-c-random","tag-cta-rastgele-sayi","tag-hashset"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/8155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=8155"}],"version-history":[{"count":32,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/8155\/revisions"}],"predecessor-version":[{"id":8190,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/8155\/revisions\/8190"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3223"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=8155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=8155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=8155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}