سؤال

حسنا, لقد تم العمل على صورة عشوائية محدد و نظام الطابور (إذا كنت لا ترى نفس الصور في كثير من الأحيان).

كل شئ كان يسير بنجاح (كما كربي رمز لا) حتى وصلت إلى عشوائية بعض الشيء.أردت اختبار, ولكن كيف يمكنك اختبار ذلك ؟ لا يوجد Debug.Assert(i.IsRandom) (للأسف) :D

حتى حصلت على الدماغ على ذلك بعد سقي مع بعض الشاي و جاء مع التالية ، أنا أتساءل فقط إذا كان يمكن أن يكون أفكارك ؟

  • أساسا أنا أعرف عشوائية كانت المشكلة لذا وقع ذلك إلى مندوب (ثم تنتقل إلى الكائنات منشئ).
  • ثم خلق فئة تقريبا تؤدي نفس المنطق كما يعيش مدونة, ولكن يتذكر قيمة المحدد في متغير.
  • ثم ألقى أنه مندوب إلى الطبقة الحية واختبارها ضد ذلك:

أي

Debug.Assert(myObj.RndVal == RndIntTester.ValuePassed);

ولكن أنا لا يمكن أن تساعد ولكن التفكير ، كنت أضيع وقتي ؟ ركضت ذلك من خلال الكثير من التكرار لمعرفة ما إذا كان سقط أكثر من في أي وقت.... الخ

هل تعتقد انني اضيع وقتي مع هذا ؟ أو يمكن أن أكون قد حصلت بعيدا مع:

Awesome Random Number Generator

GateKiller الجواب ذكرني هذا:

Dilbert Random

تحديث لتوضيح

  • وأود أن أضيف أنني لا أريد أن أرى نفس النتيجة أكثر من X عدد مرات من تجمع Y الحجم.
  • إضافة حاوية اختبار الأساس سمح لي أن نرى إذا كان أي من سبق اختيار الصور كان "عشوائيا" المختارة.
  • أعتقد من الناحية الفنية شيء هنا يجري اختبارها في RNG (منذ أنا لم أكتب هذا الكود) ولكن الحقيقة أن أنا أتوقع عشوائية النتائج من مجموعة محدودة, و أريد أن تتبع لهم.
هل كانت مفيدة؟

المحلول

اختبار من شرط :"إذا كنت لا ترى نفس الصور في كثير من الأحيان"

أطلب من 100 صورة.هل رأيت صورة في كثير من الأحيان ؟

نصائح أخرى

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

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

Item[] foo = …
for (int idx = foo.size(); idx > 1; --idx) {
  /* Pick random number from half-open interval [0, idx) */
  int rnd = random(idx); 
  Item tmp = foo[idx - 1];
  foo[idx - 1] = foo[rnd];
  foo[rnd] = tmp;
}

إذا كان لديك الكثير من البنود جمع وخلط في كل مرة (10s الآلاف من الصور في مستودع), يمكنك إضافة بعض فرق تسد نفس النهج.خلط مجموعات من الصور ، ثم خلط كل مجموعة.

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

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

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

إذا كنت تفعل اختبار الصندوق الأبيض و تعرف عشوائية البذور, ثم يمكنك فعلا حساب النتيجة المتوقعة ، ولكن قد تحتاج إلى اختبار منفصل لاختبار العشوائية من RNG.

توليد أرقام عشوائية أهم من أن يترك للصدفة.- روبرت ر.Coveyou

لحل مشكلة نفسية:

طريقة لائقة لمنع ظاهرة التكرار هو اختيار عدد قليل من البنود عشوائيا من مجموعة كاملة, التخلص من التكرارات.تلعب تلك ، ثم حدد قليلة أخرى.كم هو "قليل" يعتمد على مدى سرعة كنت تلعب بهم كيف كبيرة مجموعة كاملة ولكن على سبيل المثال تجنب تكرار داخل أكبر من "20", و "5 دقائق" قد تكون على ما يرام.هل الاختبار المستخدم - كما مبرمج عليك أن تكون مريضا جدا من الشرائح أنت ليس اختبارا جيدا الموضوع.

لاختبار randomising رمز, وأود أن أقول:

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

الخطوة 2:تأكد من مولد بما فيه الكفاية عشوائي لأغراض الخاصة بك.إذا كنت تستخدم وظيفة المكتبة ، يمكنك القيام بذلك من خلال قراءة الوثائق.إذا كتبت الخاصة بك, لماذا ؟

الخطوة 3 (متقدم الإحصائيين فقط):تشغيل بعض الاختبارات الإحصائية عن العشوائية على الناتج من المولد.تأكد من أنك تعرف ما هو احتمال كاذبة فشل في الاختبار.

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

إذا كنت تستخدم بيرل ، يمكنك استخدام إحصائيات::ChiSquare وحدة للقيام بهذا العمل الشاق بالنسبة لك.

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

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

كل خير ،

بول

ما عشوائية وظائف مماثلة تعطيك ولكن شبه عشوائي أرقام سلسلة من الأرقام المنتجة من خلال وظيفة.وعادة ما تعطي تلك الوظيفة هو أول معلمة الإدخال (أ.ك.أ."البذور") والذي يستخدم لإنتاج أول "عشوائية" عدد.بعد ذلك, كل مشاركة قيمة يستخدم معلمة الإدخال عن التكرار التالي من الدورة.يمكنك التحقق من مقالة ويكيبيديا عن "المزيف مولد رقم" التفسير هناك جيدة جدا.

كل من هذه الخوارزميات لدينا شيء مشترك: سلسلة يعيد نفسه بعد عدد من التكرارات.تذكر أن هذه ليست أرقام عشوائية حقا, فقط سلسلة من الأرقام التي يبدو عشوائي.لتحديد مولد واحد على آخر ، عليك أن تسأل نفسك:ماذا تريد ؟

كيف يمكنك اختبار العشوائية?في الواقع يمكنك.هناك الكثير من الاختبارات على ذلك.أول و أبسط هو, بالطبع, تشغيل الزائفة مولد رقم عشوائي عدد هائل من تجميع عدد مرات لكل منهما تظهر النتيجة.في النهاية كل نتيجة يجب أن ظهرت عدة مرات من مسافة قريبة جدا (عدد التكرارات)/(عدد النتائج الممكنة).وكلما زاد الانحراف المعياري من هذا أسوأ المولدات الخاصة بك.

والثاني هو:كم أرقام عشوائية تستخدم في ذلك الوقت ؟ 2, 3?تأخذ منهم في أزواج (أو tripplets) و كرر التجربة السابقة:بعد فترة طويلة من عدد من التكرارات ، كل واحد يتوقع النتيجة أن ظهرت مرة واحدة على الأقل ، ومرة أخرى في عدد مرات كل نتيجة ظهرت يجب أن لا يكون بعيدا جدا من المتوقع.هناك بعض المولدات التي تعمل على ما يرام بالنسبة اتخاذ واحد أو 2 في وقت واحد, ولكن تفشل فشلا ذريعا عندما كنت تأخذ 3 أو أكثر (RANDU أي شخص؟).

هناك أخرى أكثر تعقيدا الاختبارات:بعض تنطوي على التآمر النتائج في مقياس لوغاريتمي ، أو على الطائرة مع دائرة في الوسط ثم عد كم من المؤامرات تدخل الآخرين...أعتقد أن أولئك 2 أعلاه ينبغي أن يكون كافيا في معظم الأوقات (إلا إذا كنت صعب رياضيات).

عشوائي عشوائي.حتى لو كان نفس الصورة يظهر 4 مرات في صف واحد ، يمكن أن لا تزال تعتبر عشوائية.

رأيي هو أن أي شيء عشوائي لا يمكن اختبارها بشكل صحيح.

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

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

على أي حال, يجب أن لا تعطي أرقام عشوائية الكثير من التفكير.:)

كما أشار آخرون ، من المستحيل حقا اختبار العشوائية.يمكنك (ويجب) أن العشوائية الواردة على أسلوب واحد معين ، ومن ثم كتابة وحدة الاختبارات لكل طريقة أخرى.بهذه الطريقة, يمكنك اختبار جميع وظائف أخرى ، على افتراض أن يمكنك الحصول على رقم عشوائي من أن واحد الجزء الأخير.

تخزين عشوائية القيم قبل استخدام القادم إنشاء رقم عشوائي ، تحقق ضد القيمة المخزنة.

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

للحصول على سلسلة من عدم تكرار الأرقام العشوائية:

  1. إنشاء قائمة من الأرقام العشوائية.
  2. إضافة تسلسل رقم كل رقم عشوائي
  3. فرز قائمة متسلسلة الأصلي رقم عشوائي
  4. استخدام تسلسل العدد الجديد رقم عشوائي.

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

وأود أن تأخذ إما ن برك Y حجم التحقق من النتائج التي تظهر أكثر من X عدد مرات, أو تأخذ واحدة تجمع N*Y الحجم ، والتحقق من كل مجموعة Y حجم أي نتيجة أن يظهر أكثر من مرة س (1 Y 2 Y + 1, 3 Y + 2 ، إلخ).ما ن سيتوقف على مدى موثوقية تريد اختبار.

يتم إنشاء أرقام عشوائية من التوزيع.في هذه الحالة, كل قيمة يجب أن يكون نفس propability من الظهور.إذا كان لك حساب كمية لا حصر له من العشوائيين ، يمكنك الحصول على التوزيع الدقيق.

في الممارسة, استدعاء الدالة عدة مرات و التحقق من النتائج.إذا كنت تتوقع أن يكون N الصور, حساب 100*ن العشوائيين ، ثم عد كم من كل العدد المتوقع وجدت.يجب أن تظهر 70-130 مرات.إعادة تشغيل الاختبار مع مختلف عشوائية-البذور لمعرفة ما إذا كانت النتائج مختلفة.

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

لتجنب الصور إعادة الظهور ، تحتاج إلى شيء أقل عشوائية.نهج بسيط سيكون للتحقق من unallowed القيم إذا كان واحد من هؤلاء ، إعادة حساب.

على الرغم من أنك لا يمكن اختبار العشوائية ، يمكنك اختبار هذا الارتباط ، أو التوزيع ، من سلسلة من الأرقام.

من الصعب اختبار الهدف:في كل مرة نحتاج إلى صورة ، اختر 1 من 4 صور عشوائية.

من السهل اختبار الهدف:لكل 100 الصور نختار كل 4 صور يجب أن يظهر على الأقل 20 مرة.

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

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

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

هنا مثال في بيرل الذي يوضح ما أقصد:

for (my $i=0; $i<=100000; $i++) {
   my $r = rand;        # Get the random number
   $r = int($r * 1000); # Move it into the desired range
   $dist{$r} ++;        # Count the occurrences of each number
}

print "Min occurrences: ", (sort { $a <=> $b } values %dist)[1], "\n";
print "Max occurrences: ", (sort { $b <=> $a } values %dist)[1], "\n";

إذا كان الفارق بين min و max الحوادث الصغيرة ، ثم التوزيع الخاص بك هو جيد.إذا كانت واسعة ، ثم التوزيع قد تكون سيئة.يمكنك أيضا استخدام هذا النهج التحقق ما إذا كان لديك مجموعة كانت مغطاة وعما إذا كانت القيم غاب.

مرة أخرى, الأرقام من توليد أكثر صحة النتائج.أنا أميل إلى أن تبدأ صغيرة و العمل تصل إلى ما آلتي سوف تحمل في كمية معقولة من الزمن ، مثلخمس دقائق.

لنفترض أنك تختبر مدى العشوائية في إطار الاعداد الصحيحه ، طريقة واحدة للتحقق من هذا هو خلق عده (ربما 10,000 أو نحو ذلك) 'عشوائية' أرقام مؤامرة حدوثها على الرسم البياني.

          ******    ******           ****
***********************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
*************************************************
         1         2         3         4         5
12345678901234567890123456789012345678901234567890

أعلاه يظهر 'نسبيا' التوزيع الطبيعي.

إذا بدا أكثر منحرفة مثل هذا:

          ******    ******           ****
    ************  ************  ************
    ************  ************  ***************
    ************  ************  ****************
    ************  ************  *****************
    ************  ************  *****************
   ***************************  ******************
   **************************** ******************
******************************* ******************
**************************************************
         1         2         3         4         5
12345678901234567890123456789012345678901234567890

ثم يمكنك أن ترى أن هناك أقل من العشوائية.كما ذكر آخرون ، هناك مسألة التكرار أن يتعامل مع كذلك.

إذا كنت تريد كتابة ملف ثنائي من قول 10,000 أرقام عشوائية من المولدات الخاصة بك باستخدام, يقول رقم عشوائي من 1 إلى 1024 و محاولة ضغط الملف باستخدام بعض الضغط (zip, gzip, الخ.) ثم هل يمكن المقارنة بين اثنين من أحجام الملفات.إذا كان هناك الكثير من الضغط, ثم إنه ليس بشكل عشوائي.إذا ليس هناك الكثير من التغيير في الحجم ، ثم إنه عشوائي جدا'.

لماذا هذا يعمل

خوارزميات ضغط البحث عن أنماط (التكرار غير ذلك) ويقلل من أن في بعض الطريق.طريقة واحدة تبدو هذه خوارزميات الضغط هو قياس كمية المعلومات في ملف.A highly compressed file لديها القليل من المعلومات (على سبيل المثالالعشوائية) و قليلا-ملف مضغوط يحتوي الكثير من المعلومات (العشوائية)

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