আমার প্রশ্নটি আর -এর বিল্ট-ইন এক্সফোনেনশিয়াল এলোমেলো সংখ্যা জেনারেটর, ফাংশন দ্বারা অনুপ্রাণিত rexp()
। তাত্পর্যপূর্ণভাবে বিতরণ করা এলোমেলো সংখ্যা উত্পন্ন করার চেষ্টা করার সময়, অনেক পাঠ্যপুস্তক এই উইকিপিডিয়া পৃষ্ঠায় উল্লিখিত হিসাবে বিপরীত রূপান্তর পদ্ধতির প্রস্তাব দেয় । আমি জানি যে এই কাজটি সম্পাদন করার জন্য অন্যান্য পদ্ধতি রয়েছে। বিশেষত, আর এর উত্স কোডটি অ্যারেনস অ্যান্ড ডিয়েটার (1972) দ্বারা একটি কাগজে বর্ণিত অ্যালগরিদম ব্যবহার করে ।
আমি নিজেকে বুঝিয়েছি যে আহরনস-ডিয়েটার (এডি) পদ্ধতিটি সঠিক। তবুও, বিপরীত রূপান্তর (আইটি) পদ্ধতির তুলনায় তাদের পদ্ধতিটি ব্যবহার করার সুবিধা আমি দেখতে পাচ্ছি না। এডি কেবল আইটি-র চেয়ে বাস্তবায়ন করা জটিল নয়। গতি উপকারও হয় না বলে মনে হয়। ফলাফলগুলি অনুসরণ করে উভয় পদ্ধতি বেঞ্চমার্ক করার জন্য আমার আর কোডটি এখানে ।
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)))
ফলাফল:
[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
দুটি পদ্ধতির কোডের তুলনা করে, এডি একটি ঘনিষ্ঠভাবে র্যান্ডম নম্বর পেতে কমপক্ষে দুটি অভিন্ন র্যান্ডম সংখ্যা ( সি ফাংশন সহ unif_rand()
) আঁকেন । আইটিটির জন্য কেবল একটি অভিন্ন র্যান্ডম নম্বর প্রয়োজন। সম্ভবত আর কোর দলটি আইটি প্রয়োগের বিরুদ্ধে সিদ্ধান্ত নিয়েছিল কারণ এটি ধরে নিয়েছে যে লোগারিদম গ্রহণ করা আরও অভিন্ন র্যান্ডম সংখ্যার তুলনায় ধীর হতে পারে। আমি বুঝতে পারি লগারিদম নেওয়ার গতি মেশিন-নির্ভর হতে পারে তবে কমপক্ষে আমার পক্ষে বিপরীতটি সত্য। আইটি এর সংখ্যাগত নির্ভুলতার সাথে 0 তে লোগারিদমের এককত্বের সাথে সম্পর্কযুক্ত কিছু সমস্যা রয়েছে? তবে তারপরে, আর
উত্স কোড sexp.cজানায় যে খ্রি বাস্তবায়ন কিছু সংখ্যাসূচক স্পষ্টতা হারায় কারণ সি কোডের নিম্নলিখিত অংশ অভিন্ন র্যান্ডম নম্বর থেকে নেতৃস্থানীয় বিট সরিয়ে ফেলা হবে তোমার দর্শন লগ করা ।
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 পরবর্তীতে sexp.c এর অবশিষ্টাংশে অভিন্ন র্যান্ডম সংখ্যা হিসাবে পুনর্ব্যবহৃত হয় । এখনও পর্যন্ত, এটি প্রদর্শিত হবে
- আইটি কোড করা সহজ,
- এটি দ্রুত, এবং
- আইটি এবং এডি উভয়ই সম্ভবত সংখ্যার যথার্থতা হারাবেন।
আমি সত্যিই প্রশংসা করব যদি কেউ ব্যাখ্যা করতে পারে যে কেন কেন এখনও AD এর জন্য একমাত্র উপলভ্য বিকল্প হিসাবে AD প্রয়োগ করে rexp()
।
rexp(n)
দৃশ্যে ভাবতে পারছি না যাতে বাধা হয়ে দাঁড়াবে, গতির পার্থক্য পরিবর্তনের পক্ষে দৃ argument় যুক্তি নয় (কমপক্ষে আমার কাছে)। আমি সংখ্যার নির্ভুলতা সম্পর্কে আরও উদ্বিগ্ন হতে পারি, যদিও এটি আমার কাছে পরিষ্কার নয় যে কোনটি সংখ্যাগতভাবে নির্ভরযোগ্য হবে।