سؤال

أنا أستخدم تنفيذ C# لـ Mersenne Twister التي قمت بتنزيلها من مساحة المراكز. لدي مشكلتان في ذلك:

  1. بغض النظر عن كيفية بذرة الخوارزمية التي لا تمر اختبارات Diehard, ، وبهذا أعني أنني أحصل على الكثير من 1s و 0s لقيمة p. أيضا KSTEST على 269 p-v-v-v-v-v-v-v-v-v-v-v-v-v-v-v-lef tave chaint chaint p-value ، لكنني أعتقد أن عدد قليل من 1 و 0s في النتيجة هي أخبار سيئة.
  2. لقد طُلب مني إظهار عشوائي للأرقام بصريًا. لذلك أنا أرسم الأرقام عند توليدها ، وهذا لا يبدو عشوائيًا على الإطلاق. فيما يلي لقطة شاشة للنتيجة بعد بضع ثوان و بعد بضع ثوان. كما ترون في لقطة الشاشة الثانية ، تقع الأرقام على بعض الخطوط المتوازية. لقد جربت خوارزميات مختلفة لتعيين الأرقام إلى النقاط. كلها تؤدي إلى خطوط متوازية ، ولكن مع زوايا مختلفة! هكذا قمت بتعيين أرقام إلى نقاط لهذه لقطات الشاشة: new Point(number % _canvasWidth, number % _canvasHeight). كما قد تخمن ، تعتمد النتيجة المرئية على عرض النموذج وارتفاعه ، و هذا هو نتيجة كارثة.

فيما يلي بعض الطرق التي حاولت بها إزاحة الخوارزمية:

  1. إدخال المستخدم. أدخل بعض الأرقام لبذرة الخوارزمية كصفيف int.
  2. الأرقام العشوائية الناتجة عن الخوارزمية نفسها !!
  3. مجموعة من new Guid().GetHashCode()

ماذا أفتقد هنا؟ كيف يجب أن أعزج الخوارزمية؟ كيف يمكنني أن أحصل عليه يمر المتجول؟

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

المحلول

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

x = number % _canvasWidth;
y = number % _canvasHeight;

سوف يعطيك "نمط" يتوافق إلى حد ما مع نسبة العرض إلى الارتفاع من النافذة التي ترسمها. على سبيل المثال ، إذا _canvasWidth و _canvasHeight كانت متساوية ، فأنت سترسم دائمًا على خط قطري واحد x و y سيكون دائما هو نفسه. هذا التمثيل الرسومي لن يكون مناسبًا في هذه الحالة ، إذن.

ماذا عن أخذ أجزاء N من إخراج RNG واستخدام النصف لإحداثي X والنصف الآخر لإحداثي Y؟ لتلك البتات التي تسقط من حدود نافذتك قد ترغب في النظر في خيارين:

  1. لا ترسمهم (أو رسمها خارج الشاشة)
  2. قم بإجراء استيفاء خطي لتحديد نطاق البتات إلى عرض/ارتفاع نافذتك

يجب أن يمنحك أي خيار صورة أكثر تمثيلا عن البتات التي تحصل عليها من مولد الأرقام العشوائية الخاصة بك. حظا طيبا وفقك الله!

نصائح أخرى

يجب بسهولة إصلاح مشكلة تحديد النقاط المخططة الخاصة بك عن طريق إنشاء رقم عشوائي جديد لكل إحداثيات X و Y. إن محاولة إعادة استخدام رقم واحد تم إنشاؤه لـ X و Y هو تحسين سابق لأوانه ، ولكن إذا قمت بالانتقال إلى هذا الطريق ، فتأكد من استخراج أجزاء مختلفة لكل منها ؛ كما هي، x=n%width;y=n%height يمنحك علاقة هائلة بين X و Y ، كما يتضح في صورك.

لقد كنت أستخدم العديد من تطبيقات C ++ Mersenne Twister لسنوات (آخرها تعزيزلتوليد عشوائي نقاط ولم يكن لديه صعوبات في ذلك (ذات صلة البذور أو غير ذلك). انها حقا مولد رائع.

عشوائي حقيقي لا يمكن القيام بتوليد الأرقام مع وظيفة رياضية. إذا كان من المهم أن يكون لديك أرقام عشوائية حقًا ، احصل على أ مولد الرقم العشوائي للأجهزة. لقد قمت بتطوير ألعاب حقيقية للبوكر على الإنترنت - هذه الأجهزة هي الطريقة الوحيدة للثقة في عدم وجود أنماط في الأرقام.

إذا استهدف بيئة Linux ، /dev/عشوائي و/ديف/urandom الأجهزة الزائفة قم بعمل أفضل بكثير من المولد الرياضي ، لأنها تتضمن أرقام عشوائية تمثل نشاط الأجهزة.

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