30 Mayıs 2011 Pazartesi

Benzersiz Rastgele Sayılar (Unique Random Numbers)

Selamlar,
Bir arkadaşımın projesi için gerekli oldu. Peki Nedir "Benzersiz Rastgele Sayılar" ?
Benzersiz Rastgele Sayılar : Aynı anda birden fazla rastgele ve benzersiz sayı üretmek için kullanılabilecek sayı dizisi olarak tanımlayabiliriz kısaca. Örnek olarak 1 den 5 e kadar sayılarınız var (1,2,3,4,5). Bunların içerisinden yine 5 sayıyı da her seferinde rastgele almak istiyorsunuz. (1,5,2,4,3)(5,2,3,1,4)(4,5,3,2,1) gibi
Normalde bu 5 sayı içerisinden sadece 1 tanesini almak isteseydiniz System.Random sınıfını kullanmak yeterli olacaktı. Ancak arka arkaya 5 tane rastgele üretmek istediğinizde (Randomize kullansanız bile) sayılar birbirini tekrar edecektir. Bunu engellemek için mevcut sayıların ve seçilen sayıların birer dizi oluşturmak, seçilen sayıları mevcut sayı dizisinden çıkarmaktır.
Biraz araştırmadan sonra şöyle bir fonksiyon ortaya çıkardım. Sizin de işinize yaraması dileği ile :)
Öncelikle sayfamızın en üstünde Private rand As New Random olarak random sınıfının bir örneğini üretelim.

Public Function UniqueRandomNumbers(ByVal Count As Integer) As List(Of Integer)
Dim _allNumbers As New List(Of Integer)(Enumerable.Range(1, Count))
Dim _selectedNumbers As New List(Of Integer)
For i As Integer = 0 To Count - 1
' Mevcut numaralardan rastgele birinin indexini alalım
Dim index As Integer = rand.Next(0, _allNumbers.Count)
' Mevcut numaralardan yukarıda belirlediğimiz indexe denk gelen sayıyı kopyalayalım
Dim selectedNumber As Integer = _allNumbers(index)
' Ve seçtiğimiz numarayı seçilen numaralara ekliyoruz
_selectedNumbers.Add(selectedNumber)
' Seçilen numarayı tekrar seçilmemesi için mevcut numaralardan çıkaralım.
_allNumbers.RemoveAt(index)
Next
'Döngü tamamlandığında geriye Integer tipinde bir list geri dönecektir.
Return _selectedNumbers
End Function
Fonksiyonu uygulama içerisinde kullanmak için bir döngü kurabilirsiniz. Ben Asp.net sayfasında kullandığım için şu hale getirdim.

For Each i As Integer In UniqueRandomNumbers(10)
Response.Write(String.Format("{0}<br>", i.ToString))
Next
Kodlarınız buraya gelecek...

Faydalı olmalı dileği ile...
Share: