c# - عنوان - ما هي جودة تطبيق الفئة العشوائية في.NET؟



معنى كلمة surname (2)

فيما يتعلق بمسألة intexp ، يعد هذا خطأ ، أحد هذه intexp Microsoft ورفض إصلاحه بسبب مشكلات تتعلق بالتوافق مع الإصدارات السابقة.

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

https://src-bin.com

لدي سؤالان بخصوص تطبيق فئة Random في .NET Framework 4.6 (رمز متوفر here ):

  1. ما هو الأساس المنطقي لتحديد وسيطة Seed إلى 1 في نهاية المنشئ؟ يبدو أن يكون نسخ لصقها من Numerical Recipes في C (2nd إد.) حيث كان من المنطقي ، ولكن ليس لديها أي في C #.

  2. تم ذكره مباشرة في الكتاب ( Numerical Recipes in C (2nd Ed.) ) أنه تم تعيين حقل inextp على القيمة 31 بسبب:

الثابت 31 هو خاص ؛ انظر كنوث.

ومع ذلك ، في تنفيذ .NET ، يتم تعيين هذا الحقل على القيمة 21 . لماذا ا؟ يبدو أن بقية الشفرة تتبع عن كثب الشفرة من الكتاب باستثناء هذه التفاصيل.


Answer #1

لمزيد من السياق:

في حين أنني مرة أخرى حللت هذا التنفيذ بشكل كامل. لقد وجدت بعض الاختلافات.

أول واحد (على ما يرام تماما) هو قيمة كبيرة مختلفة ( MBIG ). تزعم السجلات الرقمية أن Knuth يوضح أن أي قيمة كبيرة يجب أن تعمل ، لذا لا يمثل ذلك مشكلة ، وقد اختارت Microsoft بشكل معقول استخدام أكبر قيمة لعدد 32 بت.

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

ولكن بعد ذلك يأتي أحد الفرق الآخر بشكل خاص. وهو حرفيًا حرصًا على التحيز في الإخراج (نظرًا لأن ذلك يعمل بشكل مباشر) ، ومن المرجح أيضًا أن يؤثر على فترة RNG.

إذن ما هي هذه القضية الثانية؟ عندما ظهرت .NET لأول مرة ، لم تدرك Microsoft أن RNG التي تم تشفيرها كانت شاملة عند كلا الطرفين ، وقاموا بتوثيقها على أنها حصرية في أقصى حد. ولإصلاح ذلك ، أضاف فريق الأمن سطرًا if (retVal == MBIG) retVal--; من التعليمات البرمجية: if (retVal == MBIG) retVal--; . هذا لسوء الحظ لأن الإصلاح الصحيح سيكون حرفياً فقط 4 أحرف المضافة (بالإضافة إلى مسافة بيضاء).

الإصلاح الصحيح قد تم تغيير int.MaxValue-1 إلى int.MaxValue-1 ، ولكن التبديل Sample() لاستخدام MBIG+1 (أي الاستمرار في استخدام int.MaxValue ). وهذا من شأنه أن يضمن أن العينة لديها النطاق [0.0 ، 1.0) دون إدخال أي تحيز ، وتغير فقط قيمة MBIG التي قالت Recumeries العددية قال Knuth أنه بخير تماما.





random