كيفية توليد عدد صحيح عشوائي في C#: الشرح النهائي
\nسؤال توليد الأرقام العشوائية هو أحد أكثر الأسئلة شيوعاً على Stack Overflow. قد يبدو الأمر بسيطاً؟ لكن في الواقع، حتى المطورين ذوي الخبرة في C# يرتكبون أخطاء كلاسيكية: يحصلون على نفس القيم في كل تشغيل، يواجهون تسلسلات غير عشوائية، أو ينسون أمان الخيوط. اليوم سنشرح بشكل نهائي كيفية توليد الأعداد الصحيحة العشوائية في C# بشكل صحيح، وسنجيب على جميع أسئلة "لماذا" من ذلك السؤال الأعلى على Stack Overflow.
\n\nهذه المقالة هي فرصتك للتوقف عن نسخ الكود من الإنترنت والبدء في فهم ما يحدث بالفعل تحت غطاء System.Random. هيا بنا!
لماذا يحصل المبتدئون على نفس الرقم مراراً وتكراراً؟
\nالسؤال الأكثر شيوعاً: "أقوم بإنشاء Random ودائماً أحصل على نفس الرقم!". دعنا نلقي نظرة على الكود النمطي الفخ:
\n\n// ❌ مثال خاطئ\nfor (int i = 0; i < 5; i++)\n{\n Random rnd = new Random();\n Console.WriteLine(rnd.Next(1, 100));\n}\n\n\nماذا سينتج هذا الكود؟ باحتمال 99% - خمسة أرقام متطابقة. لماذا؟ لأن Random يستخدم ساعة النظام للتهيئة (seed). عندما تقوم بإنشاء عدة نسخ من Random بشكل متتابع، فإنها تحصل على نفس "البذرة"، وبالتالي تولد تسلسلاً متطابقاً.
الحل الصحيح هو إنشاء نسخة واحدة من Random واستخدامها بشكل متكرر:
\n\n// ✅ مثال صحيح\nRandom rnd = new Random();\nfor (int i = 0; i < 5; i++)\n{\n Console.WriteLine(rnd.Next(1, 100));\n}\n\n\nالآن سيكون كل رقم مختلفاً. قاعدة بسيطة: Random واحد لكل مسار تنفيذ.
\n\nRandom.Next(): ثلاث طرق للحصول على عدد صحيح عشوائي
\nتقدم الفئة System.Random ثلاثة تحميلات زائدة للطريقة Next(). دعنا نستعرض كل منها مع أمثلة:
1. Random.Next() - بدون معاملات
\nتُرجع عدداً صحيحاً غير سالب في النطاق من 0 إلى Int32.MaxValue - 1. أي من 0 إلى 2,147,483,646.
Random rnd = new Random();\nint anyNumber = rnd.Next();\nConsole.WriteLine(anyNumber); // مثال: 1789034215\n\n\n2. Random.Next(Int32) - مع حد أعلى
\nتُرجع رقماً من 0 (شاملاً) إلى الحد الأقصى المحدد (غير شامل).
\nint dice = rnd.Next(7); // 0, 1, 2, 3, 4, 5 أو 6\nConsole.WriteLine(dice);\n\n\n3. Random.Next(Int32, Int32) - النطاق [min, max)
\nالخيار الأكثر شيوعاً لـ توليد عدد صحيح عشوائي في C# ضمن نطاق محدد.
\n// رقم عشوائي من 1 إلى 100 (شاملاً)\nint score = rnd.Next(1, 101);\nConsole.WriteLine(score);\n\n\nمن المهم أن تتذكر: الحد الأعلى غير شامل. للحصول على رقم من 1 إلى 6 (مثل النرد)، اكتب Next(1, 7).
أهم 3 أخطاء عند العمل مع Random في C#
\nبالاعتماد على الأسئلة الحقيقية من Stack Overflow C# random، نسلط الضوء على الأخطاء الأكثر شيوعاً:
\n\n- \n
- الخطأ رقم 1: إنشاء Random جديد داخل حلقة. لقد ناقشنا هذا بالفعل - يؤدي إلى أرقام متطابقة. الحل: ضع
new Random()خارج الحلقة. \n - الخطأ رقم 2: Random غير آمن للخيوط. إذا استخدمت عدة خيوط نسخة واحدة من
Randomدون مزامنة، فقد تحدث أعطال وقيم صفرية. استخدمlockأوThreadLocal<Random>. \n - الخطأ رقم 3: استخدام Random لكلمات المرور أو الرموز المميزة.
System.Randomهو مولد شبه عشوائي. يمكن التنبؤ به! للأمان، تحتاج إلىSystem.Security.Cryptography.RandomNumberGenerator. \n