توليد الأرقام العشوائية في C#: من المبتدئ إلى المحترف (حل السؤال الأكثر شيوعاً على Stack Overflow)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيفية توليد عدد صحيح عشوائي في C#: الشرح النهائي

\n

سؤال توليد الأرقام العشوائية هو أحد أكثر الأسئلة شيوعاً على Stack Overflow. قد يبدو الأمر بسيطاً؟ لكن في الواقع، حتى المطورين ذوي الخبرة في C# يرتكبون أخطاء كلاسيكية: يحصلون على نفس القيم في كل تشغيل، يواجهون تسلسلات غير عشوائية، أو ينسون أمان الخيوط. اليوم سنشرح بشكل نهائي كيفية توليد الأعداد الصحيحة العشوائية في C# بشكل صحيح، وسنجيب على جميع أسئلة "لماذا" من ذلك السؤال الأعلى على Stack Overflow.

\n\n

هذه المقالة هي فرصتك للتوقف عن نسخ الكود من الإنترنت والبدء في فهم ما يحدث بالفعل تحت غطاء System.Random. هيا بنا!

\n\n

لماذا يحصل المبتدئون على نفس الرقم مراراً وتكراراً؟

\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 بشكل متتابع، فإنها تحصل على نفس "البذرة"، وبالتالي تولد تسلسلاً متطابقاً.

\n\n

الحل الصحيح هو إنشاء نسخة واحدة من 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\n

Random.Next(): ثلاث طرق للحصول على عدد صحيح عشوائي

\n

تقدم الفئة System.Random ثلاثة تحميلات زائدة للطريقة Next(). دعنا نستعرض كل منها مع أمثلة:

\n\n

1. Random.Next() - بدون معاملات

\n

تُرجع عدداً صحيحاً غير سالب في النطاق من 0 إلى Int32.MaxValue - 1. أي من 0 إلى 2,147,483,646.

\n
Random rnd = new Random();\nint anyNumber = rnd.Next();\nConsole.WriteLine(anyNumber); // مثال: 1789034215\n
\n\n

2. Random.Next(Int32) - مع حد أعلى

\n

تُرجع رقماً من 0 (شاملاً) إلى الحد الأقصى المحدد (غير شامل).

\n
int dice = rnd.Next(7); // 0, 1, 2, 3, 4, 5 أو 6\nConsole.WriteLine(dice);\n
\n\n

3. 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).

\n\n

أهم 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
\n\n

كيفية توليد أرقام عشوائية مشفرة؟

المدونات

توصيات الكتب