مولد الأرقام العشوائية في جافا
تعلم كيفية توليد أرقام عشوائية بلغة جافا باستخدام أمثلة أكواد تفاعلية. استكشف Random.nextInt()، SecureRandom، ThreadLocalRandom، وMath.random() مع شروحات مفصلة.
محرر شيفرة جافا
تعلم كيفية توليد أرقام عشوائية بلغة جافا باستخدام أمثلة أكواد تفاعلية. استكشف Random.nextInt()، SecureRandom، ThreadLocalRandom، وMath.random() مع شروحات مفصلة.
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random rand = new Random();
int min = 1;
int max = 100;
int quantity = 5;
System.out.println("Random numbers between " + min + " and " + max + ":");
for (int i = 0; i < quantity; i++) {
int num = rand.nextInt(max - min + 1) + min;
System.out.print(num + " ");
}
}
}
الإنتاج
هذه معاينة في المتصفح وليست تنفيذاً لـ Java أو C++. القيم غير مناسبة للتشفير.
معاينة المثال
Basic Random مع java.util.Random
استخدم Random.nextInt() لتوليد أعداد صحيحة عشوائية في نطاق محدد. هذه هي الطريقة الأكثر شيوعا لتوليد الأعداد العشوائية العامة في جافا.
هل تحتاج إلى رقم عشوائي سريع؟
جرب مولد الأرقام العشوائية عبر الإنترنت للحصول على نتائج فورية دون الحاجة لكتابة أي شيفرة.
فهم توليد الأرقام العشوائية في جافا
توفر جافا عدة طرق لتوليد أرقام عشوائية، كل منها محسنة لحالات استخدام مختلفة. يستخدم java.util.Random خوارزمية مولد التوافق الخطي (LCG)، ويوفر SecureRandom أرقاما عشوائية قوية التشفير، ويوفر ThreadLocalRandom توليد أمان للخيوط للتطبيقات المتزامنة، ويوفر Math.random() طريقة بسيطة لتوليد الأرقام المزدوجة العشوائية.
java.util.Random
يوفر java.util.Random توليد أرقام زائفة عشوائية سريعة مناسبة للمحاكاة والألعاب والمهام البرمجية العامة. آمنة للاستخدام الأساسي مع الخيوط.
سيكيوراندروم
يستخدم java.security.SecureRandom خوارزميات خاصة بالمنصة (SHA1PRNG، NativePRNG) لإنشاء أرقام عشوائية آمنة تشفيريا لتطبيقات الأمان.
ثريدلوكال راندوم
يوفر ThreadLocalRandom توليد أرقام عشوائية فعالة آمنة للخيوط مصمم خصيصا للتطبيقات متعددة الخيوط، مما يتجنب التنافس وعبء التزامن.
Math.random()
Math.random() هي طريقة بسيطة ترجع قيمة مزدوجة بين 0.0 و1.0. مريح للحسابات السريعة لكنه أقل مرونة من الخيارات الأخرى.
حالات الاستخدام الشائعة
الألعاب والمحاكاة
توليد رميات نرد عشوائية، سحب البطاقات، ظهور الأعداء، وأحداث اللعبة باستخدام حلقات Random.nextInt() أو ThreadLocalRandom داخل اللعبة.
الأمن والتشفير
أنشئ كلمات مرور آمنة، ومفاتيح واجهات برمجة التطبيقات (API)، ورموز الجلسة، وأملاح التشفير باستخدام SecureRandom لقوة التشفير العشوائية.
التطبيقات المتزامنة
استخدم ThreadLocalRandom في التدفقات المتوازية والتطبيقات متعددة الخيوط لتجنب الخلاف وتحسين الأداء.
اختبار البرمجيات
إنشاء بيانات اختبار عشوائية، ومدخلات اختبار الضباب، والحالات الجانبية لضمان تغطية قوية للشيفرة واكتشاف الأخطاء في تطبيقات جافا.
كيف يعمل توليد الأرقام العشوائية في جافا
Java's java.util.Random class uses a Linear Congruential Generator (LCG) algorithm with a 48-bit seed. It provides a simple way to generate pseudo-random numbers and is synchronized for thread safety.
The SecureRandom class provides cryptographically strong random numbers by using platform-specific implementations. On most systems, it uses the operating system's entropy source or hardware random number generators.
ThreadLocalRandom, introduced in Java 7, is designed for multi-threaded applications. It uses a random number generator that is isolated to the current thread, avoiding synchronization overhead and contention.
نصائح عملية
اختر الواجهة الصحيحة
استخدم Random للحالات البسيطة، وSecureRandom للأمان، وThreadLocalRandom للتطبيقات المتزامنة، وMath.random() فقط للنماذج الأولية السريعة. لكل منها حالات استخدام محددة.
استخدم دائما SecureRandom للأمان
لا تستخدم أبدا Random أو Math.random() لكلمات المرور أو الرموز أو العمليات التشفيرية. استخدم دائما SecureRandom لضمان عشوائية قوية وتجنب الأنماط المتوقعة.
تحسين الوصول المتزامن
في التطبيقات متعددة الخيوط، يكون ثريدلوكال راندوم أسرع بكثير من مزامنة الكائنات العشوائية. استخدمه في تيارات متوازية ومجموعات متزامنة.
المواصفات الفنية
الخوارزميات
- المولد الخطي المتطابق (الفئة العشوائية)
- SHA1PRNG أو NativePRNG (SecureRandom)
- ThreadLocalRandom (جافا 7+، مبني على Random)
- المزدوج الزائف العشوائي (Math.random())
خصائص الأداء
- Math.random(): الأسرع للضربات المزدوجة البسيطة
- ThreadLocalRandom: الأفضل للوصول المتزامن
- عشوائي: حمل عام جيد ومتزامن
- SecureRandom: أبطأ بسبب جمع الإنتروبيا
الأسئلة المتداولة
ما هي واجهات برمجة التطبيقات (APIs) في Java التي يتم تناولها؟
java.util.Random وSecureRandom وThreadLocalRandom وMath.random()، مع مثال مخصص لكل منها.
هل يمكنني تخصيص الأمثلة؟
نعم. حدّد الحد الأدنى والحد الأقصى والعدد في لوحة المعلمات، ثم اضغط تشغيل لرؤية النتائج فورًا.
أي منها يجب استخدامها لأغراض الأمان؟
SecureRandom. أما واجهات برمجة التطبيقات الأخرى فتُعد قابلة للتنبؤ، ولا يصح الاعتماد عليها في توليد الرموز (tokens) أو المفاتيح أو كلمات المرور.
وماذا عن الشيفرة البرمجية متعددة الخيوط؟
يتجنب ThreadLocalRandom التنافس بين الخيوط، وهو الخيار المعتاد داخل التدفقات المتوازية (parallel streams) وتجمّعات الخيوط.
كيف أنشئ رقمًا عشوائيًا بين قيمتين في جافا؟
استخدم nextInt(bound) للحصول على قيم من 0 حتى bound-1، أي أن nextInt(50) ينتج قيمًا من 0 إلى 49. ولتحديد نطاق مخصص، أضف إزاحة: nextInt(10) + 5 ينتج قيمًا من 5 إلى 14. أما اعتبارًا من Java 17، فإن nextInt(origin, bound) يقوم بذلك في استدعاء واحد، حيث تكون القيمة الدنيا شاملة والقيمة العليا غير شاملة.
هل يمكن لـ Math.random() أن تُرجع 1؟
لا. تُرجع Math.random() قيمة من نوع double تبدأ من 0.0 شاملة وتصل إلى ما دون 1.0، أي أن 0.0 أو 0.9999 قد تظهران لكن 1.0 لا تظهر أبدًا. داخليًا، تعتمد هذه الطريقة على نسخة واحدة من java.util.Random، لذا فإن استدعاء طرق Random مباشرةً يكون أوضح في الأكواد الحديثة.
لماذا أحصل على نفس الأرقام العشوائية في كل مرة أشغّل فيها البرنامج؟
عند إنشاء كائن Random ببذرة ثابتة، مثل new Random(42)، فسيعيد دائمًا إنتاج نفس التسلسل تمامًا. احذف وسيط البذرة وسيتم توليدها تلقائيًا من قيمة فريدة مدمجة مع System.nanoTime(). البذور الثابتة مفيدة للاختبارات القابلة للتكرار وتصحيح الأخطاء، لكن يجب تجنبها في كود الإنتاج.
كيف أختار عنصرًا عشوائيًا من مصفوفة أو قائمة؟
أنشئ فهرسًا واقرأ ذلك الموضع: list.get(random.nextInt(list.size())) للقوائم أو array[random.nextInt(array.length)] للمصفوفات، لأن nextInt(n) تغطي القيم من 0 إلى n-1. وبدلًا من ذلك، يمكن لـ Collections.shuffle() خلط ترتيب القائمة بالكامل عشوائيًا في تمريرة واحدة، فلا يتكرر أي عنصر ضمن عملية خلط واحدة.
المراجع والموارد
-
java.util.Random - Official Javadoc
وثائق javadoc الرسمية من Oracle للفئة java.util.Random وبنيتها الداخلية القائمة على LCG.
-
Linear Congruential Generator - Wikipedia
خوارزمية المولّد التطابقي الخطي (LCG) التي تستخدمها بيئات تشغيل كثيرة.