مولد الأرقام العشوائية في Java: دليل شامل لإنشاء الأعداد الصحيحة باستخدام Math.random() وفئة Random
تُعدّ الأرقام العشوائية جزءاً لا يتجزأ من العديد من التطبيقات البرمجية الحديثة، بدءاً من الأنظمة الأمنية المعقدة وصولاً إلى الألعاب الترفيهية البسيطة. في عالم الحوسبة، تُقسم الأرقام العشوائية إلى فئتين رئيسيتين: الأرقام العشوائية الحقيقية (True Random Numbers) والأرقام شبه العشوائية (Pseudo-Random Numbers).
تُولّد الأرقام العشوائية الحقيقية بناءً على عوامل خارجية غير قابلة للتنبؤ، مثل الضوضاء المحيطة أو التفاعلات الكمومية. ومع ذلك، فإن عملية توليد هذه الأرقام تستغرق وقتاً طويلاً وتتطلب موارد خاصة. لهذا السبب، نلجأ غالباً إلى استخدام الأرقام شبه العشوائية، والتي تُولّد بواسطة خوارزميات رياضية محددة وقيمة أولية تُعرف باسم “البذرة” (seed value).
تُعتبر الأرقام شبه العشوائية كافية لمعظم الأغراض والتطبيقات، مثل استخدامها في علم التشفير (cryptography)، أو في بناء الألعاب التي تتطلب عنصر الحظ كألعاب النرد أو الورق، أو حتى في توليد كلمات المرور لمرة واحدة (OTP – One-Time Password). في هذا المقال، سنتعمق في كيفية توليد الأرقام شبه العشوائية في لغة Java باستخدام الدالة Math.random() وفئة Random، مع التركيز على إنشاء الأعداد الصحيحة.
توليد الأعداد الصحيحة باستخدام الدالة Math.random()
تُرجع الدالة Math.random() رقماً شبه عشوائي من النوع double، يكون دائماً أكبر من أو يساوي الصفر وأقل من الواحد الصحيح (أي في النطاق [0.0, 1.0)). لنختبر ذلك بمثال عملي:
public static void main (String[] args) {
double randomNumber = Math.random();
System.out.println(randomNumber);
}
// مثال على المخرجات:
// output #1 = 0.5600740702032417
// output #2 = 0.04906751303932033
في كل مرة تُنفّذ فيها الشيفرة أعلاه، ستحصل المتغير randomNumber على قيمة عشوائية مختلفة. ولكن ماذا لو أردنا توليد أرقام عشوائية ضمن نطاق محدد، على سبيل المثال، من الصفر إلى الأربعة؟
// لتوليد أرقام عشوائية بين 0 و 4
public static void main (String[] args) {
// Math.random() تُولّد أرقاماً من 0.0 إلى 0.999...
// لذا، Math.random() * 5 ستكون من 0.0 إلى 4.999...
double doubleRandomNumber = Math.random() * 5 ;
System.out.println( "doubleRandomNumber = " + doubleRandomNumber);
// تحويل القيمة العشرية إلى عدد صحيح
int randomNumber = ( int )doubleRandomNumber;
System.println( "randomNumber = " + randomNumber);
}
/* مثال على المخرجات:
doubleRandomNumber = 2.431392914284627
randomNumber = 2
*/
عند تحويل قيمة من النوع double إلى int، تحتفظ القيمة الصحيحة بالجزء الصحيح فقط من العدد، متجاهلة الجزء الكسري. ففي المثال أعلاه، إذا كانت قيمة doubleRandomNumber هي 2.431392914284627، فإن الجزء الصحيح منها هو 2، بينما الجزء الكسري هو 431392914284627. بالتالي، سيحتوي المتغير randomNumber على القيمة 2 فقط.
للحصول على معلومات إضافية حول الدالة Math.random()، يمكنك الرجوع إلى توثيقات Java الرسمية. تجدر الإشارة إلى أن استخدام Math.random() ليس الطريقة الوحيدة لتوليد الأرقام العشوائية في Java. سنتناول في القسم التالي كيفية استخدام فئة Random الأكثر مرونة.
استخدام فئة Random لتوليد الأعداد الصحيحة
توفر فئة Random العديد من الدوال (instance methods) التي تُمكننا من توليد أرقام عشوائية بأنواع مختلفة. في هذا القسم، سنركز على دالتين رئيسيتين: nextInt(int bound) و nextDouble().
كيفية استخدام الدالة nextInt(int bound)
تُرجع الدالة nextInt(int bound) رقماً شبه عشوائي من النوع int، يكون أكبر من أو يساوي الصفر وأقل من قيمة bound المحددة. يحدد المعامل bound النطاق العلوي (غير الشامل) للأرقام التي سيتم توليدها. على سبيل المثال، إذا حددنا bound بقيمة 4، فإن الدالة nextInt(4) ستُرجع قيمة من النوع int تكون أكبر من أو تساوي الصفر وأقل من الأربعة. هذا يعني أن النتائج المحتملة ستكون 0، 1، 2، أو 3.
بما أن هذه الدالة هي دالة عضو (instance method)، يجب علينا أولاً إنشاء كائن من فئة Random للوصول إليها. لنلقِ نظرة على المثال التالي:
public static void main (String[] args) {
// إنشاء كائن من فئة Random
Random random = new Random();
// توليد رقم عشوائي من 0 إلى 3
int number = random.nextInt( 4 );
System.out.println(number);
}
كيفية استخدام الدالة nextDouble()
على غرار الدالة Math.random()، تُرجع الدالة nextDouble() رقماً شبه عشوائي من النوع double، يكون أكبر من أو يساوي الصفر وأقل من الواحد الصحيح (أي في النطاق [0.0, 1.0)).
public static void main (String[] args) {
// إنشاء كائن من فئة Random
Random random = new Random();
// توليد رقم عشوائي من 0.0 وأقل من 1.0
double number = random.nextDouble();
System.out.println(number);
}
لمزيد من المعلومات حول فئة Random، يمكنك مراجعة توثيقات Java الرسمية.
أي طريقة لتوليد الأرقام العشوائية يجب أن تستخدم؟
في الواقع، تستخدم الدالة Math.random() فئة Random داخلياً لتوليد أرقامها. إذا كان كل ما تحتاجه في تطبيقك هو أرقام شبه عشوائية من النوع double، فإن استخدام Math.random() يعد خياراً بسيطاً ومباشراً.
أما إذا كنت بحاجة إلى مرونة أكبر في توليد الأرقام العشوائية بأنواع بيانات مختلفة، مثل الأعداد الصحيحة (nextInt()، nextLong()) أو الأرقام العشرية (nextFloat()، nextDouble())، فإن فئة Random توفر مجموعة أوسع من الدوال التي تلبي هذه الاحتياجات المتنوعة. كما أنها تتيح لك التحكم في البذرة (seed) إذا كنت بحاجة إلى توليد نفس التسلسل من الأرقام العشوائية لأغراض الاختبار أو المحاكاة.
الخلاصة التقنية
يُعد توليد الأرقام العشوائية مهارة أساسية في برمجة Java، وقد استعرضنا طريقتين رئيسيتين لتحقيق ذلك. توفر الدالة Math.random() حلاً سريعاً وبسيطاً لتوليد أرقام عشرية في النطاق [0.0, 1.0)، ويمكن تكييفها لإنتاج أعداد صحيحة ضمن نطاقات محددة من خلال الضرب والتحويل الصريح (casting). من ناحية أخرى، تقدم فئة Random حلاً أكثر شمولية ومرونة، مع دوال مخصصة لتوليد أرقام عشوائية من أنواع بيانات مختلفة، مما يجعلها الخيار الأمثل للتطبيقات التي تتطلب تحكماً دقيقاً أو أنواعاً محددة من الأرقام العشوائية. فهم الفروقات بين هاتين الطريقتين واختيار الأنسب لتطبيقك يضمن كفاءة وفعالية الشيفرة.