سؤال

لقد كنت أتطلع حولها، لكنني لست متأكدا من كيفية القيام بذلك.

لقد وجدت هذه الصفحة والتي، في الفقرة الأخيرة تقول:

يتم الحصول على مولد بسيط لأرقام عشوائية مأخوذة من توزيع Poisson باستخدام هذه الوصفة البسيطة: إذا كانت x1, ، X.2, ، ... هو سلسلة من الأرقام العشوائية مع توزيع موحد بين الصفر وواحد، K هو عدد صحيح للمنتج X1 · X.2 · ... · xK + 1. <هاء

لقد وجدت صفحة أخرى وصف كيفية توليد أرقام ذو حدين، لكنني أعتقد أنه يستخدم تقريب جيل Poisson، وهو ما لا يساعدني.

على سبيل المثال، النظر في أعداد عشوائية ذات حدوم. عدد عشوائي ذو حدين هو عدد الرؤوس في N ERSE من عملة معدنية باحتمال ص رؤوس على أي إرم واحد. إذا قمت بإنشاء أرقام عشوائية موحدة على الفاصل الزمني (0،1) وحسب الرقم أقل من P، فإن العد هو رقم عشوائي ذو حدين مع المعلمات N و P.

أعلم أن هناك مكتبات للقيام بها، لكن لا يمكنني استخدامها، فقط المولدات الموحدة القياسية المقدمة من اللغة (Java، في هذه الحالة).

هل كانت مفيدة؟

المحلول

توزيع السم

هنا كيف يقول ويكيبيديا أن نوث يقول للقيام بذلك:

init:
     Let L ← e^(−λ), k ← 0 and p ← 1.
do:
     k ← k + 1.
     Generate uniform random number u in [0,1] and let p ← p × u.
while p > L.
return k − 1.

في جاوة، سيكون ذلك:

public static int getPoisson(double lambda) {
  double L = Math.exp(-lambda);
  double p = 1.0;
  int k = 0;

  do {
    k++;
    p *= Math.random();
  } while (p > L);

  return k - 1;
}

توزيع ثنائي

الذهاب من الفصل 10 من جيل متغير عشوائي غير موحد (بي دي إف) بواسطة LUC Devroye (الذي وجدت مرتبطا ويكيبيديا المادة) يعطي هذا:

public static int getBinomial(int n, double p) {
  int x = 0;
  for(int i = 0; i < n; i++) {
    if(Math.random() < p)
      x++;
  }
  return x;
}

يرجى الملاحظة

لا من هذه الخوارزميات هي الأمثل. الأول هو O (λ)، والثاني هو O (ن). اعتمادا على حجم هذه القيم كبيرة، وكيف تحتاج في كثير من الأحيان إلى الاتصال بالمولدات، قد تحتاج إلى خوارزمية أفضل. تحتوي الورقة التي أربطها أعلاه على خوارزميات أكثر تعقيدا تعمل في وقت ثابت، لكنني سأترك هذه التطبيقات بمثابة تمرين للقارئ. :)

نصائح أخرى

بالنسبة لهذا والمشاكل العددية الأخرى، فإن الكتاب المقدس هو كتاب الوصفات العددية.

هناك نسخة مجانية ل C هنا: http://www.nrbook.com/a/AbookPdf.php. (البرنامج المساعد مطلوب)

أو يمكنك رؤيته على كتب Google: http://books.google.co.uk/books؟id=4t-sybvuqoc&lpg=pp1&ots=5ihminlhhho&dq=numerical ٪٪20In ٪٪20c&pg=pp1#v=onepage&q=&f=false.

يجب أن يكون رمز C سهل التحويل إلى Java.

هذا الكتاب يستحق كل هذا الوزن بالذهب للكثير من المشاكل العددية. على الموقع أعلاه، يمكنك أيضا شراء أحدث إصدار من الكتاب.

على الرغم من أن الإجابة التي تم نشرها بواسطة KIP صالحة تماما لتوليد Poisson RVS مع معدل القادمين الصغير (Lambda)، فإن الخوارزمية الثانية نشرت في ويكيبيديا توليد المتغيرات العشوائية Poisson هو أفضل لمعدل أكبر من القادمين بسبب الاستقرار العددي.

واجهت مشاكل أثناء تنفيذ أحد المشاريع التي تتطلب توليد Poisson RV مع Lambda عالية جدا بسبب هذا. لذلك أقترح في الاتجاه الآخر.

هناك العديد من التطبيقات من Cern في المكتبة التالية (رمز Java):

http://acs.lblbl.gov/~hoschek/colt/

فيما يتعلق بأعداد عشوائية ذو حدين، يعتمد على الورق من عام 1988 "جيل متغير عشوائي ذو حدين"، أن أوصي لك لأنها تستخدم خوارزمية محسنة.

يعتبر

يمكنك إضافة هذا إلى build.gradle

implementation 'org.kie.modules:org-apache-commons-math:6.5.0.Final'

واستخدام الفئة توزيع السم مزيد من التفاصيل لمنحة Poissondistribution

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top