Rastgele Sayı Üretimi - I

Rastgele Sayı Üretimi - I Bu makalede, Rastgele sayı üretimi nedir ? Rastgele sayı üretiminin kriptoloji için önemi nedir? gibi sorulara yanıt bulmaya çalışacağız.. Bilgisayarda rastgele diye bir kavram yoktur; her şey matematiksel olarak ifade edilir. Bir dizi rastgele sayı üretimi için bir çok yöntem olmasına karşın, mükemmel olarak çalışan bir algoritma bu yüzden yapılamamıştır. Çünkü, algoritmalar programın bir düzen içinde çalışmasını sağlar, fakat bizim istediğimiz düzensizliktir. Rastgele sayı üretimi için bazı işlemcilerde ve anakartlarda işlemcinin sıcaklığı, işlemcinin fanının dönüş hızı ve ya fanın çalışırken çıkardığı sesin desibel cinsinden değeri gibi ek özellikler vardır. Bu sayıları kullanarak rastgele sayı üretilmeye çalışılmaktadır. Bir dizi sayının rastgele olarak nitelendirilebilmesi için iki temel kriter vardır: Düzenli Dağılım, dizideki sayıların dağılımı düzenli olmalıdır. Yani tüm sayılar tek bir yerde dağılmamalıdır. Bağımsızlık, dizideki herhangi bir sayı kendisinden sonra gelen sayı ya da sayıları belirleyici olmamalıdır.Örneğin, 1 ile 100 arasında oluşturulmuş 20 rastgele sayı şu şekilde olsun:{ 6, 51, 53, 94, 49, 54, 7, 55, 58, 48, 50, 92, 46, 47, 57, 52, 56, 59, 4, 60 }Bu dizide bir sayıdan bir sonrakini kestirmek mümkün değildir ancak sayıların dağılımına baktığımızda 100 sayıdan alınacak 20 sayının büyük bir kısmı 46 ile 60 arasındaki dar bir alana sıkışmıştır. Grafiksel olarak ifade edersek daha açıklayıcı olacaktır. Aşağıdaki grafikte bu sayıların dağılımı gösterilmiştir.Bu yüzden bu sayıların geçerli rastgele sayılar olduğunu söylemeyiz. Aynı örneği Microsoft .NET Çerçevesinde sağlanan rastgele sayı üreticiyle oluşturalım. Sonuçta elde edilen 20 sayılık dizi şu şekildedir:{ 59, 8, 25, 97, 47, 37, 6, 66, 95, 99, 77, 74, 98, 11, 85, 54, 81, 52, 29, 2}Bu dizide, bağımsızlık ve düzenli dağılım kuralları sağlanmıştır. Aşağıdaki grafikte bu sayıların dağılımı gösterilmiştir.Kriptoloji açısından rastgele sayı üretimi önemlidir. Çünkü bir çok şifreleme algoritması rastgele sayı üretimine ihtiyaç duymaktadır. Örneğin burada da bahsettiğimiz RSA algoritması genel ve özel anahtarlarını oluştururken rastgele sayı üretimine ihtiyaç duymaktadır. Anahtar dağıtımı sırasında kullanılan oturum anahtarının oluşturulması için de rastgele sayı üreticine ihtiyaç duyulur.Microsoft .NET çerçevesinde, System altında yer alan Random sınıfı yalancı rastgele sayı üretici(Pseudorandom Number Generator) olarak çalışmaktadır. Bu sınıf, rastgele sayıların istatiksel olarak sağlaması gereken özellikleri sağlayan sınıftır. Yalancı rastgele sayı üreticileri yinelemeli olarak çalışan bir fonksiyonla ifade edilirler:Xn+1 = (aXn+c) mod mBuradaki mod işlemi, fonksiyonun üreteceği en büyük sayıyı sınırlandırmak için kullanılır. “a” çarpan, “c” de artış değeri olarak tanımlanmıştır. Üretilecek sayıların rastgeleliliği için a ve c sayılarının seçimi önemlidir. Örneğin ve a=1 ve c=1 seçilmesi ardışık bir sayı dizisi oluşturacaktır. Ayrıca ilk sayı seçimi de üreticilecek sayıları etkileyeceğinden önemlidir.Random sınıfının her hangi bir erişilebilir özelliği bulunmamaktadır. Bu sınıfın erişilebilir metotları ise şunlardır: Equals, iki nesnenin birbirine eşit olup olmadığını test eder. GetHashCode, bellekteki o nesneye özgü bir hash kodu oluşturur. GetType, bu nesnenin tipini verir. Next, rastgele bir sayı verir. NextBytes, belirtilen byte dizisini rastgele sayılarla doldurur. NextDouble, 0.0 ile 1.0 arasında rastgele bir reel sayı döndürür. ToString, şu an ki nesneyi ifade eden bir metin oluşturur.Yalancı rastgele sayı üretimi için kullanılan bu sınıf ile örnek bir uygulama geliştirelim. Bu sınıfın kurucu metotunda, formülümüzde a ve c ile sembolize ettiğimiz çarpan ve artış değerleri ayarlanır. Sürekli bu değerleri değiştirmek için aynı nesneyi tekrar oluşturmanız gerekir ki, bu önerilmez. Zaten Microsoft .NET Çerçevesi düzgün bir dağılım sağlanacağını size garanti eder. Ayrıca performans için sürekli nesneyi oluşturmak da mantıklı bir işlem değildir.C# using System; namespace TestConsoleApplication { public class TestUygulaması { static void Main() { Random rnd = new Random(); for (int i= 0;i<20;i++) Console.WriteLine(rnd.Next(1,100)); Console.Read(); } } }VB.NET Imports System Module TestConsoleApplication Sub Main() Dim rnd As New Random For i As Integer = 1 To 20 Console.WriteLine(rnd.Next(1, 100)) Next Console.Read() End Sub End ModuleC++.NET #include "stdafx.h" #using using namespace System; using namespace System::Text; using namespace System::Security::Cryptography; int _tmain() { Random __gc* rnd = __gc new Random(); for (int i= 0;i<20;i++) Console::WriteLine(rnd->Next(1,100)); Console::Read(); return 0; }J# package TestConsoleApplication; import System.*; public class TestUygulaması { public TestUygulaması() { } /** @attribute System.STAThread() */ public static void main(String[] args) { Random rnd = new Random(); for(int i= 0;i<20;i++) Console.WriteLine(rnd.Next(1,100)); Console.Read(); } }Bu kodun çıktısında oluşan sayıların gerçekten de ne kadar rastgele olduklarını bir sonraki makalemizde inceleyeceğiz. Bir sonraki makalemizde görüşünceye kadar güvende kalın...Yazar : Yunus Emre ALPÖZENe-Posta : yunus.alpozen et msakademik.net

Döküman Arama

Başlık :

Kapat