Akla ilk gelen örnekle başlayalım. Önce $[0, 2\pi]$ aralığında tekdüze dağılımdan gelen rastgele bir açı alırız. Sonra da $[0,1]$ aralığında, yarıçaptan küçük olmayı garantileyecek şekilde tekdüze dağılımdan gelen bir uzaklık seçeriz ve bu dairesel koordinatları Kartezyen koordinatlara çeviririz. Python ile yapalım ve sonucu görelim:

import numpy as np
import matplotlib.pyplot as plt

N = 5000
samples = np.zeros((2, N))

for i in range(N):
    t = 2 * np.pi * np.random.rand()
    r = np.random.rand()
    samples[:, i] = [r * np.cos(t), r * np.sin(t)]

plt.figure()
plt.plot(samples[0, :], samples[1, :], '.')
plt.axis('equal')
plt.savefig('dairede_birornek_olmayan_noktalar.png')

dairede_birornek_olmayan_noktalar

Görüldüğü üzere, bu yöntem düzgün işlemedi. Merkeze yekın yerlerde daha çok örnek elde etmiş olduk. Yani çemberin içinde her yerde eşit şekilde dağılan bir örnekleme yapamadık. Bu örnek size, çift katlı integral hesaplarında dairesel koordinatları kullanırken neden ayrıca $r$ ile çarptığımızı hatırlatmış olmalı.

Monte Carlo yöntemlerinden biri olan reddetme yöntemini (rejection sampling) de kullanabilirdik. Bunun için çemberi çevreleyen bir karenin içine eşit şekilde dağılan noktalar bulurduk, çemberin içine düşmeyenleri reddederdik. Verimlilik $\pi/4$ olurdu.

Bunun yerine tam verimli bir yöntem uygulayabilir miyiz?

Şimdi geometri bilgimizi kullanalım ve öncelikle ikizkenar bir üçgenin içinden örnek çekmeye bakalım. |AB| ve |BC| kenarları eşit olan bir ABC ikizkenar üçgeninin içinden tekdüze noktaları nasıl çekeriz? İşi kolaylaştırmak adına üçgeni, yeni bir D kenarı ekleyerek paralelkenara çevirelim. D noktası B noktasının AC kenarına göre simetriği olsun. Bu paralelkenarın içinden tekdüze noktalar çekmek kolay. AB üstünde x birim, BC'de de y birim gidip bunların vektörel toplamını, z=x+y, alırsak z noktası paralelkenarın içine düşer. Eğer z noktası ABC üçgeni içine denk düştüyse ne âlâ, başka işlem yapmamıza gerek yok; fakat eğer ADC içine düştüyse, z'nin AC'ye göre simetriğini almamız gerekir. Alttaki resimde buna örnek bir z noktası var. Bu durumda yapmamız gereken z yerine z' noktasını almak.

ucgen

Peki ikizkenar üçgen ne işimize yarayacak? Bir daire, limitte ABC açısı sıfıra yaklaşan ikizkenar üçgenlerden oluşur. Yani alttaki abartılmış örneğin limit durumundaki halini düşünebilirsiniz: AB ve BC kenarları birbirine paralel olan ABC ikizkenar üçgeni!

cember

Bu üçgenlerden birini seçmek için $[0,2\pi]$ aralığından bir açı seçelim. Ardından $[0,1]$ aralığından x ve y değişkenlerini seçelim. D noktası merkezden 2 birim uzaklıkta bir nokta. Seçilen değişkenlerin toplamları, yani z, 1'den büyükse simetriğini alalım, değilse aynen öyle bırakalım. Limit durumunda simetriğini almak 2 - z ile eşdeğer. Python'da sonuca bakalım:

for i in range(N):
    t = 2 * np.pi * np.random.rand()
    z = np.random.rand() + np.random.rand()
    if z > 1:
        r = 2 - z
    else:
        r = z
    samples[:, i] = [r * np.cos(t), r * np.sin(t)]

plt.figure()
plt.plot(samples[0, :], samples[1, :], '.')
plt.axis('equal')
plt.savefig('dairede_birornek_noktalar.png')

dairede_birornek_noktalar

Noktalar gerçekten de çemberin içinde tekdüze dağılıyor!

Not: Bu yazıda şu kaynaktan oldukça yararlandım.