Random fonksiyonu ne kadar doğru?

Random fonksiyonu bildiğiniz gibi rasgele sayı üretmek için kullandığımız bir fonksiyon. Peki hiç düşündünüz mü, rasgele fonksiyonu gerçekten rasgele mi sayı üretiyor? Tabi ki bunun cevabı Hayır olacaktır. Çünkü belirli matematiksel fonksiyonlara dayalı olan bu fonksiyon asla rasgele değildir. (Bunun kötü yanlarından biri aynı fonksiyonu aynı şartlar içerisinde kullanan kişi aynı değerleri elde edebilir. Buda yazılımsal olarak elde edilmiş tüm işlemlerde bir Hackleme olarak kullanılabilir.)

Random sayı üretmek için kullanılan TRNGs (True Random Number Generators) ve PRNGs (Pseudo-Random Number Generators) yöntemleri kullanılır. TRNG rasgele sayıları üretmek için öngörülemeyen fiziksel yollar üretilir, PRNG ise tamamen bilgisayarda oluşturulmuş matematiksel algoritmalar veya önceden elde edilmiş tablolardan oluşturulur.

TRNG ile üretilen rasgele sayı niçin öngörülemeyen bir fiziksel yolla üretilir? Örneğin bir uçağın sürüş animasyondan tutun bir tavla oyunundaki zarın tavlanın üzerine düşüş ve çarpmanın etkisiyle oluşan sıçramalardan sonra gelebilecek sayının hesaplanması gibi yüksek hesaplama ve istatistik gerektiren işlemlerde çevrenin faktörü gibi (Rüzgar,Nem, Sürtünme Katsayısı) gibi etkin faktörlerde hesaba katıldığında rasgelelik artırılmış olur ki buda hesaplanamaz bir işlem değildir. Yıldız sistemleri ve hareketleri gibi yüksek hesaplama gerektiren işlemler şimdi süper bilgisayarlar ile kolaylık ile yapılıyorken. Bu gibi hesaplamalarda kolaylıkla yapılabilir.

Hardware Random Number Generator

Hardware Random Number Generator ile yazılımsal bir rasgele sayı üreteclerinin aksine donanımsal bir rasgele sayı üretecidir. Bu tür cihazlar genellikle termal gürültü, fotoelektrik etki veya diğer kuantum fenomenler gibi düşük düzeyde istatistiksel rastgele “gürültü” sinyallerine dayanmaktadır. Daha ayrıntılı bilgiyi Vikipedi,Wikipedia dan bakabilirsiniz.

PRNG ile yöntemini kullanan fonksiyonumuz çoğu zaman işimizi görecektir, fakat kriptografik anahtarlar, piyango, istatistik araştırmalar için kullanıldığında hiçte güvenli ve sağlıklı olmayan sonuçlar doğuracaktır. Oyunlarınızda kullanıldığında tahmin edilebilirlik artacaktır, İstatistiksel olarak tüm ihtimaller elde edilebilir olacaktır.

Konuyu birazdaha örnekleyerek açıklayalım.

PHP
PHP ile 512 x 512 piksellik sıralı oluşturulan bir resim oluşturalım ve örneğini inceleyelim.

<?php
$gd = imagecreatetruecolor(512, 512);
$white = imagecolorallocate($gd, 255, 255, 255); 
for ($y = 0; $y < 512; $y++) {
    for ($x = 0; $x < 512; $x++) {
        if (rand(0, 1)) {
            imagesetpixel($gd, $x, $y, $white);
        }
    }
} 
header('Content-Type: image/png');
imagepng($gd);
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>PHP Random Deneme</title>
    </head>
    <body>
    </body>
</html>
Php çıktısı

Görüldüğü gibi resim simetrik şekiller içermektedir ve bu istenmeyen bir durumdur ve tahmin edilebilir. Random sayı elde etmek için kullanılan yöntem, oluşturulmuş bir tablodan elde ediliyor veya basit bir algoritmadan oluşturuluyor. Buda sabit olarak değerler elde ediliyor anlamına gelir ki tahmin edilmesi çok kolay. Bunun için Random.org dan ücretli ve ücretsiz sağlanan servislerden yararlanılabilirek daha güzel Random değerler elde edilebilir.

Örneğin : http://www.random.org/integers/?num=100&min=1&max=6&col=1&base=10&format=plain&rnd=new
Servisi ile 1 ile 6 arasında 100 tane sayı üreten bir sonuç alabilirsiniz. Bunu programlarınızda http Get fonksiyonu ile yakalayıp işlem yapabilirsiniz.

Asp.Net
Asp.Net ile 512 x 512 piksellik sıralı oluşturulan bir resim oluşturalım ve örneğini inceleyelim.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Text;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void Button1_Click(object sender, EventArgs e)
    { 
        Bitmap objBitmap;
        Graphics objGraphics;

        objBitmap = new Bitmap(512, 512);
        objGraphics = Graphics.FromImage(objBitmap);
        Pen pen1 = new Pen(Color.White, 1F);

        objGraphics.Clear(Color.Black);

        Random rd = new Random();

        for (int i = 0; i < 512; i++)
        {
            for (int j = 0; j < 512; j++)
            {
                int value = rd.Next(0, 2);
                if (value == 1)
                    objGraphics.DrawLine(pen1, j, i, j + 1, i + 1);
            }
        }

        objBitmap.Save(Response.OutputStream, ImageFormat.Gif);
        objBitmap.Save(Server.MapPath("x.jpg"), ImageFormat.Jpeg);

        objBitmap.Dispose();
        objGraphics.Dispose();    
    }
}
C# çıktısı

Bunda sonuç daha güzel sıralı olmayan simetrik şekillerin olmadığı gözüküyor. Başka bir deney yapalım bu sefer aynı anda iki tane random oluşturalım ve ikisinin sonuçlarına bakalım bize .Net’in Random sayı üretmedeki sağlamlığını verecek mi bakalım.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace RandomInCSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] bytes1 = new byte[100];
            byte[] bytes2 = new byte[100];
            Random rnd1 = new Random();
            Random rnd2 = new Random();

            rnd1.NextBytes(bytes1);
            rnd2.NextBytes(bytes2);

            Console.WriteLine("İlk Seri:");
            for (int ctr = bytes1.GetLowerBound(0);
                 ctr <= bytes1.GetUpperBound(0);
                 ctr++)
            {
                Console.Write("{0, 5}", bytes1[ctr]);
                if ((ctr + 1) % 10 == 0) Console.WriteLine();
            }
            Console.WriteLine();
            Console.WriteLine("İkinci Seri:");
            for (int ctr = bytes2.GetLowerBound(0);
                 ctr <= bytes2.GetUpperBound(0);
                 ctr++)
            {
                Console.Write("{0, 5}", bytes2[ctr]);
                if ((ctr + 1) % 10 == 0) Console.WriteLine();
            }

            Console.ReadLine();
        }
    }
}

Kötü bir sonuçla daha karşı karşıyayız. İki farklı Random fonksiyonumuz fakat aynı sonuçları oluşturdu. Bilindiğiniz gibi Random fonksiyonlarında zamanın Saniye bilgisi sıklıkla kullanılır böylece farklı sonuçlar elde edilmeye çalışılır. Yani her butona bastığınızda farklı bir sonuç karşımıza çıkması için. Fakat aynı saniyede oluşturulmuş bir Random ile aynı sonuçları veren bir fonksiyon karşısında bütün önlemler etkisiz kalacaktır.

0 ile 100 arasında bir sayı tutun ve tahmin edilebilirliğine bakalım. İnsan beyni mantıksal işlem yaparak aklında sayıyı tutar. Peki bu sayının tahmini olabilir mi? Tabi ki %100 olmasa da bu sayınında tahmini olabilir. Beyin frekanslarını dinleme veya beyni şartlama yöntemleri ile. Frekans yöntemine pek değinmeyeceğim. Bilim adamlarının araştırmaları ile insan düşüncelerinin okunabildiğini ve hayal ettiği nesnenin ne olduğunu bilebildiklerini ve bunu üzerinde yoğun bir araştırma yaptıklarını biliyoruz. Peki beyni şartlama yöntemi nedir? Bu da aslında karmaşık gibi gözüken aslında basit bir yöntemdir. Bir kişiye aklında tutması istenen sayıyı belirleyip ona farkettirmeden çeşitli şekillerde sayıyı göstererek tahmin etmede beyni şartlayabilirsiniz. Örnek “25.Kare (25. Frame) olarak bilinen yöntem (Bir filim izlerken insan gözü 1 saniyede 24 kare görür. ve 25. kareye gizlenmiş bir mesajı dolayısı ile göremeyecektir. Fakat çok ilginçtir ki insan beyni çok hızlı çalışır ve bu görüntüyü algılar. Böylece vermek istenen mesaj insana empoze edilir. Bu yöntem yasaklanmıştır.)” ve “Aklından bir renk ve alet tut deneyi? ”

Bir örnek ile açıklayalım: Örneğin arkadaşınıza tahmin edeceği sayı 29 olarak belirleyelim ve çeşitli zamanlarda onun görmesi ve duyması için bu sayıyı ona empoze edelim. Örneğin “bu gün havanın 29 derece olduğunu ona söyleyelim. Masasında üzerinde 29 yazan bir kupa koyalım. Daha sonra ayın 29’unda ne yapacağını soralım”. Bunun gibi örnekleri artırarak beyni şartlamayı ona fark ettirmeden çoğaltalım. Tabi ki ne kadar şartlama artırılırsa tahmin edilebilirlik artacaktır. Arkadaşınıza 0 ile 40 arasında bir sayı tuttuğunda sayının kaç olduğunu sorduğunuzda 29 deme ihtimali diğer sayılara göre çok daha yüksektir. Buda beynin olaylardan etkilendiğini göstererek bir mantıksal tahmin yaptığını gösteriyor. Peki mantıksal tahminler matematiksel fonksiyonlara dökülebilir mi? Bunun cevabı da Bence Evet, şöyle bir deney yapılarak bunun sonucu da araştırılabilir. Örneğin bir kişinin günlük yaşamdaki karılaştığı olaylar, duyduğu sayılar, hissettikleri hesapladığı işlemler hepsi aynı anda verileri toplanarak tahmin ettiği sayılar ile ilişki kurulduğunda, mantıksal olayları matematiğe dökülmüş halinde bir fonksiyon elde edilebiliriz ki şu anda çok karmaşık ve güç gibi geliyor. Tabi ki bu deneyde elde edilen fonksiyon her bir kişide değişiklik gösterecektir ki. İnsanların çevresel ve yaşamdan elde ettiği deneyimler dahilinde zihin yapıları ve düşünme yapıları, beynin çalıştırdığı bölgeyi ve bu bölgeyi çalıştırma şiddetine göre farklılık gösterir.

Random fonksiyonların karmaşıklaştırılarak tahmin edilebilirliği çok daha zor bir hale getirilebilir. Ama asla çözülemez diye bir iddia olmaz. Hızla gelişen teknoloji ile çok hızlı işlem yapabilen işlemciler geliştirilmeye devam ederken bu gibi rasgelelik matematiksel fonksiyonlara dayandığı sürece her zaman çözümü kolay olacaktır.

TRNG ve PRNG karşılaştırmalarını ve kullanılan programlama dillerinde elde edilen sonuçlardaki verimlilik gibi ayrıntılı biligiler için Vikipedi, Wikipedia den ve Random.Org dan bulabilirsiniz.

Leave a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir