فئة عشوائية (java.util)
الخوارزمية العشوائية التي تم تنفيذها في الفئة العشوائية هي العشوائية الزائفة ، أي عشوائيًا مع القواعد. عند إجراء التوزيع العشوائي ، يسمى عدد أصل الخوارزمية العشوائية البذور ، والتي تؤدي تحولًا معينًا على أساس البذور ، وبالتالي توليد الأرقام العشوائية المطلوبة.
الكائنات العشوائية مع نفس عدد البذور ، الأرقام العشوائية الناتجة عن نفس عدد المرات هي نفسها بالضبط. بمعنى آخر ، بالنسبة لكائنين عشوائيين مع نفس رقم البذور ، فإن الأرقام العشوائية التي تم إنشاؤها لأول مرة هي نفسها تمامًا ، والأرقام العشوائية التي تم إنشاؤها للمرة الثانية هي نفسها تمامًا. هذا يتطلب اهتماما خاصا عند توليد أرقام عشوائية متعددة.
يصف ما يلي استخدام الفئة العشوائية ، وكذلك كيفية إنشاء مجموعة عشوائية من الفواصل الزمنية المحددة والفرص المطلوبة في برنامج التنفيذ.
1. توليد الأشياء العشوائية
تحتوي الفئة العشوائية على مُنشئين ، يتم تقديمهما بالتسلسل أدناه:
أ. عشوائي عام ()
تستخدم طريقة البناء هذه رقمًا مرتبطًا بالوقت النسبي المقابل لوقت النظام الحالي كرقم البذور ، ثم يستخدم رقم البذور هذا لبناء الكائن العشوائي.
ب. عشوائي عام (بذرة طويلة)
يمكن إنشاء هذا المنشئ عن طريق صياغة رقم البذور.
نموذج الرمز:
نسخة الكود كما يلي:
عشوائي R = جديد عشوائي () ؛
عشوائي R1 = عشوائي جديد (10) ؛
مرة أخرى: عدد البذور هو مجرد رقم أصل الخوارزمية العشوائية وليس له علاقة بفاصل الأرقام العشوائية التي تم إنشاؤها.
2. الطرق الشائعة في فئة عشوائية
الطرق في الفئة العشوائية بسيطة نسبيًا ، كما أن وظائف كل طريقة سهلة الفهم أيضًا. تجدر الإشارة إلى أن الأرقام العشوائية التي تم إنشاؤها بواسطة كل طريقة في الفئة العشوائية موزعة بشكل موحد ، مما يعني أن احتمال الجيل العددي داخل الفاصل يساوي. فيما يلي مقدمة أساسية لهذه الطرق:
أ. المنطق العام NextBoolean ()
تتمثل وظيفة هذه الطريقة في إنشاء قيمة منطقية عشوائية ، واحتمال توليد القيم الحقيقية والخطأ متساوية ، أي كلاهما 50 ٪.
ب. Public Double Nextdouble ()
الغرض من هذه الطريقة هو إنشاء قيمة مزدوجة عشوائية ، مع القيمة بين [0 ، 1.0).
ج ، عام int nextint ()
الغرض من هذه الطريقة هو إنشاء قيمة عشوائية ، والتي تتراوح بين -231 و 231-1.
إذا كنت بحاجة إلى إنشاء قيمة int لفاصل محدد ، فأنت بحاجة إلى إجراء تحول رياضي معين. للحصول على التفاصيل ، يرجى الرجوع إلى الرمز الموجود في مثال الاستخدام أدناه.
D ، Int Nextint (int n)
تتمثل وظيفة هذه الطريقة في إنشاء قيمة int عشوائية ، والتي تقع ضمن الفاصل الزمني لـ [0 ، n) ، أي قيمة int عشوائية بين 0 و n ، تحتوي على 0 ولكن ليس n.
إذا كنت ترغب في إنشاء قيمة int لفاصل محدد ، فأنت بحاجة أيضًا إلى إجراء تحول رياضي معين. للحصول على التفاصيل ، يرجى الرجوع إلى الرمز الموجود في مثال الاستخدام أدناه.
E ، public void setseed (بذرة طويلة)
الغرض من هذه الطريقة هو إعادة تعيين عدد البذور في الكائن العشوائي. بعد تعيين عدد البذور ، يكون الكائن العشوائي هو نفس الكائن العشوائي الذي تم إنشاؤه مع الكلمة الرئيسية الجديدة.
3. مثال استخدام الفئة العشوائية
باستخدام الفئة العشوائية ، يكون عمومًا إنشاء أرقام عشوائية لفاصل محدد. سيؤدي ما يلي إلى تقديم كيفية إنشاء أرقام عشوائية للفاصل الزمني المقابل واحدًا تلو الآخر. يتم إنشاء الرموز التالية التي تنشئ أرقام عشوائية باستخدام الكائن العشوائي التالي R:
عشوائي R = جديد عشوائي () ؛
أ. توليد عشرة عشرية من الفاصل الزمني [0 ، 1.0)
نسخة الكود كما يلي:
Double D1 = R.NextDouble () ؛
يتم الحصول عليها مباشرة باستخدام طريقة NextDouble.
ب. توليد عشرة عشرية من الفاصل الزمني [0،5.0)
نسخة الكود كما يلي:
Double D2 = R.NextDouble () * 5 ؛
نظرًا لأن الفاصل الزمني الذي تم إنشاؤه بواسطة طريقة NextDouble هو [0 ، 1.0) ، فإن توسيع الفاصل الزمني بمقدار 5 مرات هو الفاصل الزمني المطلوب.
وبالمثل ، لتوليد عشري عشوائي في الفاصل الزمني [0 ، D) و D هو أي عشرية إيجابية ، تحتاج فقط إلى مضاعفة قيمة إرجاع طريقة NextDouble بواسطة d.
ج. توليد العشرية في الفاصل الزمني [1،2.5)
نسخة الكود كما يلي:
Double D3 = R.NextDouble () * 1.5 + 1 ؛
لإنشاء عشرية عشوائية للفاصل الزمني [1 ، 2.5) ، تحتاج فقط إلى إنشاء رقم عشوائي من الفاصل الزمني [0 ، 1.5) ثم إضافة 1 إلى الفاصل الزمني العشوائي الذي تم إنشاؤه.
وبالمثل ، لإنشاء أي رقم عشوائي في نطاق الفاصل الزمني العشري [D1 ، D2) الذي لا يبدأ من 0 (حيث لا يساوي D1 0) ، تحتاج فقط إلى إنشاء رقم عشوائي في الفاصل الزمني [0 ، D2-D1) ثم إضافة الفاصل الزمني العشوائي الذي تم إنشاؤه إلى D1.
د. توليد أي عدد صحيح
نسخة الكود كما يلي:
int n1 = r.nextint () ؛
فقط استخدم طريقة NextInT مباشرة.
ه. توليد الأعداد الصحيحة في الفاصل الزمني [0،10)
نسخة الكود كما يلي:
int n2 = r.nextint (10) ؛
N2 = Math.ABS (R.NextInt () ٪ 10) ؛
يمكن لخطين أعلاه من الكود إنشاء أعداد صحيحة في الفاصل الزمني [0،10).
يتم تنفيذ التطبيق الأول مباشرة باستخدام طريقة NextInt (int n) في الفئة العشوائية.
في التنفيذ الثاني ، استدعاء First NextInt () لإنشاء رقم int تعسفي. الفاصل الزمني الناتج عن مجموع رقم 10 هو (-10،10) ، ثم ابحث عن القيمة المطلقة للفاصل الزمني ، والفاصل الزمني الذي تم الحصول عليه هو [0،10).
وبالمثل ، لإنشاء أعداد صحيحة عشوائية في أي فاصل [0 ، ن) يمكنك استخدام الكود التالي:
نسخة الكود كما يلي:
int n2 = r.nextint (n) ؛
n2 = math.abs (r.nextInt () ٪ n) ؛
و. توليد الأعداد الصحيحة في الفاصل الزمني [0،10]
نسخة الكود كما يلي:
int n3 = r.nextint (11) ؛
N3 = Math.ABS (R.NextInt () ٪ 11) ؛
بالمقارنة مع الفاصل الصحيح ، فإن الفاصل الزمني [0،10] وفاصل [0،11) متكافئ ، لذلك يتم إنشاء عدد صحيح من الفاصل [0،11).
ز. توليد أعداد صحيحة في الفاصل الزمني [-3،15)
نسخة الكود كما يلي:
int n4 = r.nextint (18) - 3 ؛
N4 = Math.ABS (R.NextInt () ٪ 18) - 3 ؛
لإنشاء أعداد صحيحة عشوائية لا تبدأ من 0 ، يمكنك الرجوع إلى الوصف أعلاه لمبدأ التنفيذ للفاصل العشري الذي لا يبدأ من 0.
ح ، فرصة لتحقيق
إن تطبيق منطق البرنامج وفقًا لفرصة معينة هو أيضًا مشكلة يمكن حلها عن طريق المعالجة العشوائية. فيما يلي مثال بسيط لإظهار كيفية تنفيذ منطق الصدفة باستخدام أرقام عشوائية.
في مقدمة الطريقة السابقة ، تكون الأرقام التي تم إنشاؤها في طريقة NextINT (int n) موحدة ، أي أن فرص توليد كل رقم داخل الفاصل هي نفسها. ثم إذا تم إنشاء عدد صحيح عشوائي في الفاصل الزمني [0،100) ، فيجب أن تكون فرص كل رقم يتم إنشاؤه هي نفسها ، وبما أن هناك 100 أعداد صحيحة في الفاصل الزمني ، فإن فرص كل رقم 1 ٪. وفقًا لهذه النظرية ، يمكن تحقيق مشكلة الاحتمال في البرنامج.
مثال: قم بإنشاء عدد صحيح بشكل عشوائي يولد 1 بنسبة 55 ٪ ، 2 مع فرصة 40 ٪ ، و 3 مع فرصة 5 ٪. الرمز المنفذ هو كما يلي:
نسخة الكود كما يلي:
int n5 = r.nextint (100) ؛
int m ؛ // رقم النتيجة
إذا (N5 <55) {// الفاصل الزمني لـ 55 رقمًا ، فرصة 55 ٪
م = 1 ؛
} آخر إذا (n5 <95) {// [55،95) ، فاصل 40 رقمًا ، فرصة 40 ٪
م = 2 ؛
}آخر{
م = 3 ؛
}
لأن احتمال كل رقم 1 ٪ ، فإن احتمال أي فاصل 55 رقمًا هو 55 ٪. لراحة كتابة الكود ، يتم استخدام جميع الأعداد الصحيحة في الفاصل [0،55) هنا ، والمبدأ اللاحق هو نفسه.
بالطبع ، يمكن تبسيط الكود هنا لأن الاحتمالات مضاعفات بنسبة 5 ٪ ، لذلك فقط تحكم في الفرص على أساس 5 ٪. فيما يلي تطبيق الكود المبسط:
نسخة الكود كما يلي:
int n6 = r.nextint (20) ؛
int M1 ؛
إذا (n6 <11) {
M1 = 1 ؛
} آخر إذا (n6 <19) {
M1 = 2 ؛
}آخر{
M1 = 3 ؛
}
داخل البرنامج ، يمكن تنفيذ منطق الاحتمال وفقًا للتعليمات المذكورة أعلاه.
4. قضايا أخرى
أ. مشكلة الكائن العشوائي مع نفس رقم البذور
كما ذكرنا سابقًا ، فإن الكائنات العشوائية التي تحمل نفس عدد البذور لها نفس الأرقام العشوائية التي تم إنشاؤها بنفس عدد المرات. ما يلي هو رمز الاختبار:
نسخة الكود كما يلي:
عشوائي R1 = عشوائي جديد (10) ؛
عشوائي R2 = عشوائي جديد (10) ؛
لـ (int i = 0 ؛ i <2 ؛ i ++) {
system.out.println (r1.nextint ()) ؛
system.out.println (r2.nextint ()) ؛
}
في هذا الرمز ، فإن عدد البذور المستخدمة من قبل الكائنات R1 و R2 هي 10 ، وبالتالي فإن الأرقام العشوائية التي تم إنشاؤها بنفس عدد المرات هي نفسها تمامًا.
إذا كنت ترغب في تجنب الموقف الذي تكون فيه الأرقام العشوائية متماثلة ، فأنت بحاجة إلى ملاحظة أنه بغض النظر عن عدد الأرقام العشوائية التي تحتاجها لإنشاء في المشروع ، يمكنك استخدام كائن عشوائي واحد فقط.
ب. حول الطريقة العشوائية في فئة الرياضيات
في الواقع ، هناك أيضًا طريقة عشوائية في فئة الرياضيات. مهمة هذه الطريقة العشوائية هي توليد عشرية عشوائية للفاصل [0 ، 1.0).
من خلال قراءة الكود المصدري لفئة الرياضيات ، يمكننا أن نجد أن الطريقة العشوائية في فئة الرياضيات يتم تنفيذها مباشرة من خلال استدعاء طريقة NextDouble مباشرة في الفئة العشوائية.
إنه فقط أن الطريقة العشوائية تسمى بسيطة نسبيًا ، حيث اعتاد العديد من المبرمجين على استخدام الطريقة العشوائية لفئة الرياضيات لإنشاء أرقام عشوائية.