يشرح هذا الفصل أولاً عدة طرق لإنشاء أرقام عشوائية Java ، ثم يوضحها من خلال أمثلة.
ملخص:
هل ستقول هنا ، ما هي صعوبة توليد أرقام عشوائية؟ أليس فقط لاستخدام Java مغلف عشوائي؟ بالطبع ، لا بأس بشكل عام ، وتستند الخوارزميات التي سيتم شرحها في هذه المقالة أيضًا إلى وظيفة المكتبة العشوائية هذه.
تركز هذه المقالة بشكل أساسي على سلوك أخذ العينات ، ويحتوي أخذ العينات نفسها على قاعدة ضمنية لا توجد بيانات مكررة. حسنًا ، مع هذه التعليمات. يمكنك أولاً محاولة استخدام بعض أفكارك الخاصة لإنشاء أرقام عشوائية دون جيل متكرر.
محاولات الخوارزمية:
تظهر بعض الخوارزميات الجيدة ، وغالبًا ما تكون مصحوبة ببعض خوارزميات غير جيدة. ومع ذلك ، بالنسبة للخوارزميات التي ليست فعالة للغاية ، فهي تتمتع عمومًا بميزة واحدة مشتركة ، والتي يسهل فهمها وتنفيذها. فيما يلي تفسير موجز من خلال نهج خطوة بخطوة.
المحاولة الأولى: خوارزمية عشوائية ساذجة
هذه الخوارزمية سهلة الفهم ، إنها عشوائية! في كل مرة يتم إنشاء رقم عشوائي وإضافته إلى المجموعة.
private void simplerandom (int start ، int end ، int count) {system.out.println ("الخوارزمية العشوائية الطبيعية:") ؛ StringBuffer Buffer = new StringBuffer () ؛ لـ (int i = 0 ؛ i <count ؛ i ++) {int random = numberUtils.RandomInteger (start ، end) ؛ buffer.append (i == 0؟ ("[" + Random): ("،" + Random)) ؛ } buffer.append ("]") ؛ System.out.println (Buffer) ؛ } المحاولة الثانية: تحقق من وجود خوارزمية عشوائية الوجود
نحن نعلم أن هناك مشكلة في الطريقة أعلاه ، أي ، قد تكون هناك بيانات مكررة. لذلك ، فكرنا في التحقق مما إذا كان الرقم موجودًا بالفعل عند إنشاء رقم عشوائي ، وإذا كان موجودًا ، فسيتم تجديده.
checkRandom private void (int start ، int end ، int count) {system.out.println ("تحقق من الخوارزمية العشوائية الوجودية:") ؛ StringBuffer Buffer = new StringBuffer () ؛ قائمة <integer> Save = New ArrayList <> () ؛ لـ (int i = 0 ؛ i <count ؛ i ++) {int random = numberUtils.RandomInteger (start ، end) ؛ if (exits (Save ، عشوائي)) {i-- ؛ يكمل؛ } save.add (عشوائي) ؛ buffer.append (i == 0؟ ("[" + Random): ("،" + Random)) ؛ } buffer.append ("]") ؛ System.out.println (Buffer) ؛ } المحاولة الثالثة: خوارزمية عشوائية لإزالة العنصر
لقد حلت الخوارزمية أعلاه مشكلة تكرار البيانات. ومع ذلك ، فإن مشكلة واحدة سيئة للغاية هي أن الأمر قد يستغرق وقتًا طويلاً لإنشاء أرقام عشوائية عينة (وهذا يعتمد على الوجه ...).
ومع ذلك ، هنا لدينا أفكار جديدة. وهذا هو استخدام رقم عشوائي في مجموعة ، وإزالته عند تحديد ذلك. ثم ، ألا تصل بشكل عشوائي إلى هذا الرقم مرة أخرى عندما يكون عشوائيًا؟ هذا يحل مشكلة تكرار الأرقام العشوائية بشكل جيد للغاية. الرمز كما يلي:
removerandom private void (int start ، int end ، int count) {system.out.println ("element removal random hlugorithm:") ؛ StringBuffer Buffer = new StringBuffer () ؛ قائمة <integer> الأرقام = initList (ابدأ ، نهاية) ؛ لـ (int i = 0 ؛ i <count ؛ i ++) {int random = numberUtils.RandomInteger (count - i) ؛ buffer.append (i == 0؟ ("[" + number.get (عشوائي)): ("،" + number.get (عشوائي))) ؛ الأرقام. } buffer.append ("]") ؛ System.out.println (Buffer) ؛ } المحاولة الرابعة: نقل خوارزمية عشوائية للدولة
في العديد من مدوناتي السابقة ، بعض عمليات نقل الدولة في الخوارزميات. نقل الدولة هو أيضا واحدة من الخوارزميات المفضلة لدي. يمثل الشكل 1 أدناه نطاق قيمة الأرقام العشوائية ، والرقم البرتقالي في التسلسل هو التسلسل العشوائي في النتيجة. هناك بعض الأسهم المنقطة في التسلسل السفلي ، والتي تمثل انتقال الحالة.
الشكل 1 أخذ عينات من خوارزمية توليد الأرقام العشوائية بناءً على انتقال الحالة
رمز التنفيذ:
private void statusRandom (int start ، int end ، int count) {system.out.println ("status Transfer Random Random Gensm:") ؛ StringBuffer Buffer = new StringBuffer () ؛ int [] status = new int [end + 1] ؛ لـ (int i = 0 ؛ i <count ؛ i ++) {int random = numberUtils.RandomInteger (start ، end) ؛ System.err.println (عشوائي) ؛ if (الحالة [عشوائي] == 0) {buffer.append (i == 0؟ ("[" + random): ("،" + random)) ؛ الحالة [عشوائي] = عشوائي == نهاية؟ ابدأ: (عشوائي + 1) ؛ // من المستحيل أن يكون لديك رقم قبل البدء} آخر {// نقل الحالة int index = عشوائي ؛ do {index = status [index] ؛ } بينما (الحالة [الفهرس]! = 0) ؛ buffer.append (i == 0؟ ("[" + index): ("،" + index)) ؛ الحالة [الفهرس] = الفهرس == نهاية؟ ابدأ: (فهرس + 1) ؛ // من المستحيل أن يكون لديك رقم قبل البدء}} buffer.append ("]") ؛ System.out.println (Buffer) ؛ } المحاولة الخامسة: خوارزمية عشوائية فلويد العودية
خوارزمية فلويد هي في نهاية المطاف عملية نقل الدولة. ستتطلب الخوارزمية قائمة أو صفيف لتخزين الرقم العشوائي المحدد. كما يوحي الاسم ، سأستخدم الحلول العودية هنا. في عملية العودية ، نقوم بنقل حالة الرقم العشوائي I-TH إلى الرقم العشوائي I-1. الرمز كما يلي:
قائمة خاصة <integer> simplefloyd (قائمة <integer> ، عدد int ، int start ، int end) {if (count == 0) {return list ؛ } list = simplefloyd (list ، count - 1 ، start ، end - 1) ؛ int عشوائي = numberUtils.randominteger (ابدأ ، نهاية) ؛ if (list.contains (عشوائي)) {list.add (end) ؛ } آخر {list.add (عشوائي) ؛ } قائمة الإرجاع ؛ } المحاولة السادسة: تكرار على خوارزمية عشوائية فلويد
تشبه الفكرة الخوارزمية العشوائية المتكررة أعلاه ، ولكن هنا نضيف متغيرًا لتحسينه. لم تعد هناك حاجة للتكرار. الرمز كما يلي:
قائمة خاصة <integer> التكرار Floyd (int start ، int end ، int count) {system.out.println ("خوارزمية عشوائية floyd التكرارية:") ؛ قائمة <integer> list = new ArrayList <> () ؛ لـ (int i = end - count+1 ؛ i <end ؛ i ++) {int random = numberUtils.RandomInteger (start ، i) ؛ if (list.contains (عشوائي)) {list.add (i) ؛ } آخر {list.add (عشوائي) ؛ }} قائمة الإرجاع ؛ } نتائج الاختبار:
الشكل 2 الشكل 2 نتائج اختبار خوارزمية العدد العشوائي
في نتائج الاختبار أعلاه ، يمكننا أن نرى بوضوح أن الخوارزمية العشوائية الساذجة لا تحتوي على بيانات مكررة فحسب ، بل هي أيضًا الأكثر استهلاكًا للوقت. لذلك ، تجنب استخدام هذه الخوارزمية عند إنشاء أرقام عشوائية تم أخذ عينات منها. من بين الخوارزميات الأخيرة ، فإن خوارزمية نقل الحالة العشوائية هي الأفضل ، والخوارزمية العشوائية المتكررة هي الثانية. هذا يمكن أن يكون وفقا للتفضيلات الشخصية.