الأرقام العشوائية في Java: من الفوضى إلى النظام
\n\nمرحبًا، أيها المبرمج المستقبلي بلغة Java! إذا كنت قد كتبت يومًا ألعابًا أو محاكيات أو اختبارات أو أردت ببساطة إضافة عنصر المفاجأة إلى برنامجك، فمن المؤكد أنك واجهت الحاجة إلى الحصول على عدد صحيح عشوائي ضمن نطاق محدد. قد يبدو الأمر بسيطًا، لكن في الواقع، كثيرًا ما يسأل المبتدئون: "لماذا أحصل على أرقام من 0 إلى 100 وليس من 50 إلى 100؟" أو "لماذا يظهر خطأ في الكود الخاص بي؟".
\n\nاليوم سنشرح هذا الموضوع مرة واحدة وإلى الأبد. ستتعلم كيفية توليد رقم عشوائي في Java في أي نطاق باستخدام ثلاث طرق رئيسية. مفاجأة: إحداها هي الخيار الأفضل لـ 90% من الحالات. هيا بنا!
\n\nلماذا هذا مهم؟
\nتوليد الأرقام العشوائية مهمة أساسية ولكنها بالغة الأهمية. لا يمكن الاستغناء عنها عند:
\n- \n
- إنشاء بيانات اختبارية (مثل معرفات المستخدمين). \n
- تنفيذ آليات الألعاب (سقوط العناصر، توليد المستويات). \n
- محاكاة العمليات العشوائية (قوائم الانتظار، حركة المرور). \n
- اختيار عنصر عشوائي من قائمة. \n
بإتقان هذا الموضوع، ستتوقف عن الخوف من "السحر" في الكود وستتمكن من التحكم في العشوائية بثقة.
\n\nالطريقة رقم 1: الكلاسيكية — java.util.Random
\nهذا هو جد جميع المولدات في Java. فئة java.util.Random موجودة منذ الإصدارات المبكرة جدًا ولا تزال تُستخدم بنشاط. ميزتها الرئيسية هي تعدد الاستخدامات.
كيفية الحصول على int عشوائي من 0 إلى N؟
\nالطريقة nextInt(int bound) تُرجع رقمًا عشوائيًا من 0 (شاملًا) إلى bound (غير شامل). أي إذا كتبت nextInt(10)، ستحصل على رقم من 0 إلى 9.
import java.util.Random;\n\npublic class RandomExample {\n public static void main(String[] args) {\n Random random = new Random();\n int number = random.nextInt(10); // 0..9\n System.out.println("الرقم العشوائي: " + number);\n }\n}\n\nماذا عن جعله من 5 إلى 15؟
\nهنا يكمن السر الرئيسي. للحصول على رقم في نطاق عشوائي [min, max]، يجب استخدام الصيغة:
min + random.nextInt(max - min + 1)
لنشرح بمثال: النطاق من 5 إلى 15.
\n- \n
max - min + 1= 15 - 5 + 1 = 11. إذًاnextInt(11)سيعطي أرقامًا من 0 إلى 10. \n - نضيف
min(5): نحصل على النطاق 5..15. \n
نتحقق: إذا أعاد nextInt(11) القيمة 0، فإن 0+5 = 5. إذا أعاد 10، فإن 10+5 = 15. مثالي!
Random random = new Random();\nint min = 5;\nint max = 15;\nint randomNumber = min + random.nextInt(max - min + 1);\nSystem.out.println("رقم عشوائي من 5 إلى 15: " + randomNumber);\n\nهام: لا تنسَ +1! بدونه ستكون القيمة القصوى أقل بمقدار 1.
الطريقة رقم 2: النهج الحديث — ThreadLocalRandom
\nبدءًا من Java 7، ظهرت فئة ThreadLocalRandom. وهي مصممة خصيصًا للتطبيقات متعددة الخيوط (ولكنها تعمل بشكل ممتاز أيضًا في التطبيقات أحادية الخيط). الميزة الرئيسية هي أنها أسرع من Random ولا تتطلب إنشاء كائن منفصل.
الاستخدام في الكود أحادي الخيط
\nلديها طريقة ملائمة nextInt(int origin, int bound) التي تقبل مباشرة حدود النطاق! لاحظ: origin شامل، bound غير شامل. إذا كنت بحاجة إلى تضمين الحد الأعلى أيضًا، فقط أضف +1.
import java.util.concurrent.ThreadLocalRandom;\n\npublic class ThreadLocalRandomExample {\n public static void main(String[] args) {\n // رقم من 5 إلى 15 (شاملًا)\n int randomNumber = ThreadLocalRandom.current().nextInt(5, 16);\n System.out.println("الرقم العشوائي: " + randomNumber);\n }\n}\n\nأترى كم هو بسيط؟ لا حاجة لأي صيغ،