Benim sorum R 'yerleşik üstel rasgele sayı üreteci, fonksiyonu esinlenerek rexp()
. Üstel olarak dağıtılmış rasgele sayılar oluşturmaya çalışırken, birçok ders kitabı bu Wikipedia sayfasında ana hatlarıyla belirtildiği gibi ters dönüştürme yöntemini önerir . Bu görevi yerine getirmenin başka yöntemleri olduğunun farkındayım. Özellikle, R'nin kaynak kodu Ahrens & Dieter (1972) tarafından bir makalede ana hatları çizilen algoritmayı kullanmaktadır .
Ahrens-Dieter (AD) yönteminin doğru olduğuna kendimi ikna ettim. Yine de, ters dönüşüm (IT) yöntemine kıyasla yöntemlerini kullanmanın faydasını görmüyorum. AD'nin uygulanması BT'den daha karmaşık değildir. Bir hız yararı da yok gibi görünüyor. İşte her iki yöntemi de takip eden sonuçları takip eden R kodum.
invTrans <- function(n)
-log(runif(n))
print("For the inverse transform:")
print(system.time(invTrans(1e8)))
print("For the Ahrens-Dieter algorithm:")
print(system.time(rexp(1e8)))
Sonuçlar:
[1] "For the inverse transform:"
user system elapsed
4.227 0.266 4.597
[1] "For the Ahrens-Dieter algorithm:"
user system elapsed
4.919 0.265 5.213
İki yöntemin kodunu karşılaştıran AD, bir üstel rasgele sayı elde etmek için en az iki tekdüze rasgele sayı çizer ( C fonksiyonu ile unif_rand()
). BT'nin tek bir rastgele sayıya ihtiyacı vardır. Muhtemelen R çekirdek ekibi BT'nin uygulanmasına karşı karar verdi çünkü logaritmayı almanın daha tekdüze rastgele sayılar üretmekten daha yavaş olabileceğini varsayıyordu. Logaritma alma hızının makineye bağlı olabileceğini anlıyorum, ama en azından benim için tam tersi doğru. Belki de BT'nin sayısal hassasiyeti etrafında 0'daki logaritmanın tekilliğiyle ilgili sorunlar var mı? Ama sonra, R
kaynak kodu sexp.cCı aşağıdaki kod bölümü muntazam rasgele sayıdan gelen bit kaldırır, çünkü AD uygulanması bazı sayısal hassas kaybeder ortaya u .
double u = unif_rand();
while(u <= 0. || u >= 1.) u = unif_rand();
for (;;) {
u += u;
if (u > 1.)
break;
a += q[0];
}
u -= 1.;
u daha sonra sexp'in geri kalanında tek tip rastgele bir sayı olarak geri dönüştürülür . Şimdiye kadar, sanki
- BT'nin kodlanması daha kolaydır,
- BT daha hızlı ve
- hem BT hem de AD sayısal doğruluğu kaybedebilir.
Birisi R neden hala kullanılabilir tek seçenek olarak AD uygular açıklayabilir eğer gerçekten takdir ediyorum rexp()
.
rexp(n)
Darboğaz olacak tek bir senaryo düşünemediğim göz önüne alındığında, hızdaki fark, değişim için güçlü bir argüman değil (en azından benim için). Hangisinin daha sayısal olarak güvenilir olacağı açık olmasa da, sayısal doğruluk konusunda daha fazla endişelenebilirim.