Genel Bakış
Rnd (Rnd function), VBA'da 0'a eşit ya da 0'dan büyük, 1'den küçük rastgele bir Single sayı döndüren işlevdir. Tek başına ondalık bir sayı verir; belirli bir aralıkta tam sayı, rastgele seçim, çekiliş ya da liste karıştırma gibi işlemler için bu sayı Int işleviyle ölçeklenir. Üretilen dizi Randomize deyimiyle kontrol edilir: her çalıştırmada farklı ya da her seferinde aynı sayılar elde edilebilir.
Ondalıklı bir aralık gerekiyorsa Int kullanmadan şu kalıp yeterlidir:
Int işlevi sayıyı aşağı yuvarlar. Bu nedenle kalıptaki "+ 1" sayesinde üst sınır da sonuç olabilir. Bu kalıbı Cells ve Range ile birleştirerek çalışma sayfasına sayı yazabilir, bir listeden rastgele satır seçebilirsiniz.
Makro B2:B9 aralığına 50 ile 100 arasında notlar yazar; örneğin Ahmet Yılmaz için 96, Ayşe Demir için 81 değeri üretilmiştir. Aynı başlangıç değeri kullanıldığı için makroyu her çalıştırdığınızda aynı notları elde edersiniz. Başlangıç değerini değiştirirseniz farklı bir dizi oluşur.
Makro, A2:A9 aralığındaki isimlerden birini rastgele seçer ve C2 hücresine yazar. Bu çalıştırmada çekilişin sonucu Hasan Öztürk olmuştur. Randomize kullanıldığı için makroyu her çalıştırdığınızda başka bir katılımcı çıkabilir. Liste uzarsa kod son satırı otomatik bulduğu için değişiklik gerekmez.
A sütunundaki sekiz ürün adı, B sütununa rastgele bir sırayla yazılır; karışık listenin ilk ürünü Fare, ikincisi Tarayıcı olmuştur. Her ürün B sütununda yalnız bir kez görünür, çünkü yöntem yeni sayı çekmek yerine mevcut öğelerin yerini değiştirir. Orijinal liste A sütununda değişmeden kalır.
Söz dizimi
Rnd işlevinin söz dizimi şöyledir:
VBA
2 satır
Rnd[(Sayı)]
Randomize [Sayı]
- Sayı (Number): Rnd için isteğe bağlı bir Single ifadesidir. Verilmezse işlev, sıradaki rastgele sayıyı üretir (sıfırdan büyük değerle aynı davranır). Davranışı değerin işareti belirler.
- Randomize için Sayı: İsteğe bağlıdır. Verilirse rastgele sayı üretecinin başlangıç değeri (seed) olarak kullanılır. Verilmezse sistem saati (Timer işlevinin değeri) başlangıç değeri olur.
Sayı değerine göre davranış
Rnd işlevinin argümanı, hangi sayının döneceğini belirler:- Sıfırdan küçük (örneğin -1): Her seferinde aynı sayıyı verir. Verdiğiniz değer başlangıç değeri olarak kullanılır.
- Sıfırdan büyük ya da argüman yok: Dizideki bir sonraki rastgele sayıyı verir.
- Sıfıra eşit: En son üretilen sayıyı yeniden verir; yeni sayı üretmez.
Belirli aralıkta sayı üretme
Rnd'nin 0-1 arasındaki değerini istediğiniz aralığa dönüştürmek için genel kalıp şudur. Burada alt ve üst, aralığın en küçük ve en büyük tam sayılarıdır:Int((ust - alt + 1) * Rnd + alt)
alt + (ust - alt) * Rnd
1. Tekrarlanabilir rastgele notlar
Sekiz öğrencinin sınav notlarını 50 ile 100 arasında rastgele üretmek istiyorsunuz. Notlar her çalıştırmada aynı çıksın diye önce Rnd(-1), ardından sabit bir sayıyla Randomize kullanılır. Kodu standart bir modüle (Ekle > Modül) yapıştırın.
VBA
15 satır
Option Explicit
Sub RastgeleNotlar()
Dim i As Long
Dim d As Single
' Tekrarlanabilir dizi: önce Rnd(-1), sonra sabit değerli Randomize
d = Rnd(-1)
Randomize 42
For i = 2 To 9
' 50 ile 100 arasında (ikisi de dahil) tam sayı
Cells(i, 2).Value = Int((100 - 50 + 1) * Rnd + 50)
Next i
End Sub
Rnd
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Öğrenci | Sınav Notu |
| 2 | Ahmet Yılmaz | 96 |
| 3 | Ayşe Demir | 81 |
| 4 | Mehmet Kaya | 58 |
| 5 | Fatma Çelik | 72 |
| 6 | Mustafa Şahin | 50 |
| 7 | Zeynep Arslan | 79 |
| 8 | Emre Koç | 83 |
| 9 | Elif Aydın | 51 |
Sınav NotlarıExcelDepo v1.0.0
2. Listeden rastgele kazanan seçme
Katılımcı listesinden rastgele bir kişiyi çekilişle seçmek istiyorsunuz. Randomize her çalıştırmada farklı bir sonuç vermesini sağlar. Son dolu satır bulunur, 2 ile bu satır arasında rastgele bir satır numarası üretilir ve kazananın adı C2 hücresine yazılır. Kodu standart bir modüle yapıştırın.
VBA
18 satır
Option Explicit
Sub CekilisYap()
Dim sonSatir As Long
Dim secilen As Long
' Her çalıştırmada farklı sonuç için sistem saatiyle başlat
Randomize
' A sütunundaki son dolu satırı bul
sonSatir = Cells(Rows.Count, 1).End(xlUp).Row
' 2 ile sonSatir arasında rastgele satır numarası
secilen = Int((sonSatir - 2 + 1) * Rnd + 2)
' Kazananın adını C2 hücresine yaz
Cells(2, 3).Value = Cells(secilen, 1).Value
End Sub
Rnd
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | Katılımcı | Şehir | Kazanan |
| 2 | Hasan Öztürk | Ankara | Hasan Öztürk |
| 3 | Selin Yıldız | İzmir | |
| 4 | Burak Aksoy | Bursa | |
| 5 | Derya Kurt | Antalya | |
| 6 | Cem Polat | Konya | |
| 7 | Gül Erdoğan | Adana | |
| 8 | Oğuz Tekin | Trabzon | |
| 9 | Nur Güneş | Eskişehir |
ÇekilişExcelDepo v1.0.0
3. Listeyi rastgele karıştırma
Bir ürün listesini rastgele sıraya dizmek için Fisher-Yates yöntemi kullanılır. Adlar bir diziye alınır, Rnd ile sondan başa doğru yer değiştirilir ve karışık sıra B sütununa yazılır. Sonuç tekrarlanabilsin diye sabit başlangıç değeri verilmiştir. Kodu standart bir modüle yapıştırın.
VBA
33 satır
Option Explicit
Sub ListeyiKaristir()
Dim dizi() As String
Dim n As Long, i As Long, j As Long
Dim gecici As String
Dim d As Single
' Listedeki ürün sayısı (başlık hariç)
n = Cells(Rows.Count, 1).End(xlUp).Row - 1
ReDim dizi(1 To n)
For i = 1 To n
dizi(i) = Cells(i + 1, 1).Value
Next i
' Tekrarlanabilir sıra için sabit başlangıç değeri
d = Rnd(-1)
Randomize 7
' Sondan başa doğru rastgele yer değiştir
For i = n To 2 Step -1
j = Int(i * Rnd) + 1
gecici = dizi(i)
dizi(i) = dizi(j)
dizi(j) = gecici
Next i
' Karışık listeyi B sütununa yaz
For i = 1 To n
Cells(i + 1, 2).Value = dizi(i)
Next i
End Sub
Rnd
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Ürün | Karışık Sıra |
| 2 | Dizüstü Bilgisayar | Fare |
| 3 | Yazıcı | Tarayıcı |
| 4 | Monitör | Klavye |
| 5 | Klavye | Yazıcı |
| 6 | Fare | Monitör |
| 7 | Tarayıcı | Web Kamerası |
| 8 | Kulaklık | Kulaklık |
| 9 | Web Kamerası | Dizüstü Bilgisayar |
Ürün SırasıExcelDepo v1.0.0
Kullanırken dikkat edin
- Randomize'ı döngü içinde çağırmayın: Randomize'ı bir döngünün içinde tekrar tekrar çalıştırırsanız, zaman değeri çok yakın olduğu için aynı ya da birbirine çok benzer sayılar üretilebilir. Randomize'ı yordamın başında yalnızca bir kez çağırın.
- Randomize olmadan her oturumda aynı dizi: Randomize çağırmadan Rnd kullanırsanız Excel her açıldığında aynı sayı dizisi üretilir. Bu, test sırasında işe yarar ama gerçek rastgelelik beklediğiniz çekiliş ve benzeri işlerde sorun yaratır.
- Tekrarlanabilir dizi için sıra önemlidir: Aynı sayı dizisini yeniden elde etmek için önce Rnd(-1), sonra Randomize ile sabit bir sayı çağırın. Sıra ters olursa ya da Rnd(-1) atlanırsa dizi her seferinde aynı olmayabilir.
- Int ve üst sınır: Rnd hiçbir zaman 1 değerini döndürmez. Bu yüzden tam sayı üretirken (üst - alt + 1) çarpanını kullanmayı unutmayın; aksi halde üst sınır hiç çıkmaz. Int yerine Round kullanmak uçlardaki sayıların daha seyrek çıkmasına yol açar.
- Güvenlik için uygun değildir: Rnd, tahmin edilebilir bir sözde rastgele sayı üretecidir. Parola, anahtar ya da güvenliğin önemli olduğu başka işler için kullanmayın.
- Çalışma sayfası işlevleriyle farkı: Hücrede rastgele sayı gerekiyorsa RASTGELE ve RASTGELEARADA işlevleri kullanılabilir; bunlar sayfa her hesaplandığında değişir. VBA'daki Rnd değeri ise makro çalıştığında üretilir ve hücreye değer olarak yazılırsa sabit kalır.
- İlgili konular:
- Randomize deyimi: Rnd için başlangıç değerini belirler.
- Int işlevi: Rnd sonucunu tam sayıya çevirmek için kullanılır.
- Timer işlevi: Randomize'ın varsayılan başlangıç değeri olarak kullandığı saat değeri.
- RASTGELE ve RASTGELEARADA: Çalışma sayfasındaki rastgele sayı işlevleri.
- WorksheetFunction.RandBetween: VBA'dan RASTGELEARADA işlevini çağırma yolu.
- Cells ve Range nesneleri: Üretilen sayıları sayfaya yazmak için.