سؤال

لقد قمت ببعض الاختبارات على الفئة العشوائية وقد استخدمت الكود التالي:

while (x++ <= 5000000)
{
    y = rnd.Next(1, 5000000);
    if (!data.Contains(y))
        data.Add(y);
    else
    {
        Console.WriteLine("Cycle {2}: Repetation found for number {0} after {1} iteration", y, x, i);
        break;
    }
}

ظللت أقوم بتغيير حد RND Max (أي 5000000) وقمت بتغيير عدد التكرارات وحصلت على النتيجة التالية:

1) if y = rnd.Next(1, 5000) : The average is between 80 to 110 iterations
2) if y = rnd.Next(1, 5000000) : The average is between 2000 to 4000 iterations
3) if y = rnd.Next(1, int.MaxValue) : The average is between 40,000 to 80,000 iterations.

لماذا أحصل على هذه المتوسطات ، أي من أصل 10 مرات قمت بتسجيل كل قيمة ، 80 ٪ من الوقت الذي أحصل عليه ضمن هذا النطاق المتوسط. لا أعتقد أننا نستطيع أن نسميها بالقرب من عشوائي.

ماذا يمكنني أن أفعل للحصول على رقم عشوائي إلى حد ما.

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

المحلول

أنت لا تختبر دورات. أنت تختبر المدة التي يستغرقها الحصول على رقم عشوائي كان لديك من قبل. هذا مختلف تماما. أرقامك موجودة لاختبار المدة التي يستغرقها الحصول على رقم عشوائي لديك من قبل. انظر إلى ويكيبيديا تحت "The Birthday Paradox" للحصول على مخطط من احتمال الحصول على تصادم بعد عدد معين من التكرارات.

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

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

ومع ذلك ، فإن طول الدورة ليس هو المقياس الوحيد لجودة مولد عدد العشوائي الزائفة. تذكر أن PRNGs ليس عشوائيا, ، هم انهم قابل للتنبؤ, ، وبالتالي عليك أن تفكر بعناية فائقة حول ما هو مقياس "العشوائية".

امنحنا المزيد من التفاصيل: لماذا تهتم بكيفية عشوائي "عشوائي"؟ ما التطبيق الذي تستخدمه لذلك تهتم؟ ما هي جوانب العشوائية المهمة بالنسبة لك؟

نصائح أخرى

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

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

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

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

أنت تحكم على العشوائية عن طريق تكرار أزواج ، وهو ليس أفضل اختبار للعشوائية. التكرارات التي تراها أقرب إلى مفارقة عيد الميلاد: http://en.wikipedia.org/wiki/birthday_problem, ، حيث يمكن أن يحدث حدث متكرر بحجم عينة صغير إذا كنت لا تبحث عن حدث معين.

لكل الوثائق في http://msdn.microsoft.com/en-us/library/system.random.aspx

لإنشاء رقم عشوائي آمن من الناحية التشفير مناسب لإنشاء كلمة مرور عشوائية ، على سبيل المثال ، استخدم فئة مشتقة من System.Security.Cryptography .. ::. RandomNumbergeneratorمثل System.Security.Cryptography .. ::. rngcryptoserviceprovider.

لا يمكن للكمبيوتر إنشاء رقم عشوائي حقيقي. إذا كنت بحاجة إلى رقم عشوائي حقيقي (أعطاك ديفيد الخيار الأفضل من DOT Net Framework) ، فأنت بحاجة إلى مصدر عشوائي خارجي.

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