سؤال

لدي رمز Fortran90 الموازي حيث يحتاج كل مؤشر ترابط إلى إنشاء نفس التسلسل من الأرقام العشوائية.

لدي منشئ أرقام عشوائية يبدو أنه غير آمن للسلسلة، لأنه بالنسبة لبذرة معينة، لا أستطيع تمامًا تكرار نفس النتائج في كل مرة أقوم فيها بتشغيل البرنامج.

لقد قمت بتصفح الويب بالكامل دون جدوى (تقريبًا) بحثًا عن بعض التعليمات البرمجية لـ RNG الآمن لسلسلة الرسائل.هل يمكن لأي شخص أن يقدم لي (الرابط إلى) رمز واحد؟

شكرا لك مقدما!

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

المحلول

عدد المزيف مولد لويمكن الاطلاع Fortran90 في في إنتل الرياضيات نواة مكتبة المتجهات الإحصائية . فهي موضوع آمنة. أيضا، فلماذا تحتاج إلى أن تكون threadsafe؟ إذا كنت تريد كل موضوع للحصول على نفس القائمة، مثيل PRNG جديد لكل موضوع مع نفس البذور.

نصائح أخرى

الأكثر تكرار عدد المولدات العشوائية تحتاج الدولة بشكل أو بآخر. دون دولة، فإنها لا تستطيع أن تفعل ما يأتي بعد ذلك. من أجل أن تكون الخيط آمنة، وكنت بحاجة إلى وسيلة للتمسك الدولة نفسك (أي أنه لا يمكن أن تكون عالمية).

عندما تقول "يحتاج إلى إنشاء نفس التسلسل من الأرقام العشوائية" هل تقصد ذلك

  • هل يحتاج كل خيط إلى إنشاء دفق من الأرقام المتطابقة مع الخيط الآخر؟ وهذا يعني اختيار البذرة قبل تقشير الخيوط، ثم إنشاء مثيل PRNG للخيط المحلي في كل خيط بنفس البذرة.

أو

  • هل تريد أن تكون قادرًا على تكرار نفس التسلسل من الأرقام بين عمليات التشغيل المختلفة للبرامج، ولكن كل خيط يولد تسلسله المستقل الخاص به؟ في هذه الحالة، لا يزال يتعذر عليك مشاركة PRNG واحد لأن تسلسل تشغيل الخيط غير محدد.لذا، قم ببذر PRNG واحد ببذرة معروفة قبل إطلاق الخيوط، واستخدمها لإنشاء البذور الأولية للخيوط. ثم يمكنك إنشاء مثيل للمولدات المحلية لمؤشر الترابط في كل موضوع ...

في كل حالة من هذه الحالات يجب عليك ملاحظة ما نيل بتروورث قل عن الإحصائيات:معظم الضمانات المعتادة التي ترغب PRNG في المطالبة بها هي غير موثوقة عند خلط التدفقات المتولدة بهذه الطريقة.


في كلتا الحالتين تحتاج إلى PRNG لمؤشر الترابط المحلي.لا أعرف ما هو المتوفر في f90...ولكن يمكنك أيضًا كتابة ما تملكه (lookup ميرسين الاعصار, ، واكتب روتينًا يأخذ الحالة المحفوظة كمعلمة...).

في فورتران 77، سيبدو هذا شيئًا مثل

      function PRNGthread (state)

      double state(statesize)

c stuff happens here which uses and manipulates the state vector...

      PRNGthread = result
      return 

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

وأنا أفهم تحتاج كل موضوع لإنتاج نفس تيار من الأرقام العشوائية.

وA جيد جدا الزائفة عشوائية مولد من شأنها أن تولد تيار reproducable من الأرقام وسريع جدا هو في MT19937 . فقط تأكد من أن توليد البذور قبل وضع البيض قبالة المواضيع، ولكن توليد نسخة منفصلة من MT في كل موضوع (جعل مثيل موضوع MT المحلية). بهذه الطريقة سيكون مضمونا أن كل MT سوف تنتج نفس تيار من الأرقام.

وماذا عن SPRNG ؟ لم أحاول بنفسي بالرغم من ذلك.

وأنا مشفرة لفورتران 90 نسخة موضوع الآمن للميرسين الإعصار / MT19973. يتم حفظ حالة PRNG في نوع مشتق (randomNumberSequence)، واستخدام إجراءات البذور المولد أو الحصول على العنصر التالي في تسلسل.

HTTP: //code.google.com/p/i3rc-monte-carlo-model/source/browse/trunk/Code/RandomNumbersForMC.f95

يبدو أن البدائل هي:

  • استخدم كائن التزامن (مثل mutex) على قيمة بذور المولد.سيؤدي هذا للأسف إلى تسلسل الكود الخاص بك على الوصول إلى المولد
  • استخدم تخزين مؤشر الترابط المحلي في المولد حتى يحصل كل مؤشر ترابط على بذرة خاصة به - قد يسبب ذلك مشاكل ساتسية لتطبيقك
  • إذا كان النظام الأساسي الخاص بك يدعم عملية ذرية مناسبة ، فاستخدم ذلك على البذرة (ربما لن يحدث ذلك)

أعلم أنها ليست قائمة مشجعة للغاية.وللإضافة إلى ذلك، ليس لدي أي فكرة عن كيفية تنفيذ أي منها في FORTRAN!

هذا المقال https://www.cmiss.org/openCMISS/wiki/RandomNumberGenerationWithOpenMP لا يرتبط فقط بتطبيق Fortran، ولكنه يذكر النقاط الأساسية اللازمة لجعل PRNG قابلاً للاستخدام مع الخيوط.النقطة الأكثر أهمية هي:

يحتوي إصدار Fortran90 من Ziggurat على العديد من المتغيرات والمصفوفات ذات السمة "SAVE".من أجل موازنة RNG الموحد، يبدو أن التغييرات المطلوبة هي جعل هذه المتغيرات صفائف ذات قيمة منفصلة لكل خيط (احذر من المشاركة الزائفة).ثم عند استدعاء وظيفة PRNG، يجب علينا تمرير رقم الخيط واستخدام قيمة الحالة المقابلة.

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