ماذا نتعلم من الكتب؟
الطريقة الأكثر وضوحًا وبديهية هي إنشاء أرقام عشوائية في Java مع مكالمة بسيطة:
java.lang.math.random ()
في جميع اللغات الأخرى ، يشبه إنشاء أرقام عشوائية استخدام فئات أدوات الرياضيات مثل ABS و POW والأرضية و SQRT وغيرها من الوظائف الرياضية. يتعلم معظم الناس هذه الفئة من خلال الكتب والدروس والدورات التدريبية. مثال بسيط: يمكن إنشاء رقم نقطة عائم دقة مزدوجة من 0.0 إلى 1.0. ثم من خلال المعلومات المذكورة أعلاه ، يريد المطور إنشاء رقم نقطة عائم مزدوج بين 0.0 و 10.0 واكتبه على هذا النحو:
Math.Random () * 10
إذا تم إنشاء عدد صحيح بين 0 و 10 ، فسيتم كتابته على النحو التالي:
Math.Round (Math.Random () * 10)
متقدم
من خلال قراءة الكود المصدري لـ Math.random () ، أو ببساطة استخدام وظيفة الإكمال التلقائي لـ IDE ، يمكن للمطورين العثور بسهولة على أن java.lang.math.random () يستخدم كائنًا داخليًا تم إنشاؤه عشوائيًا - يمكن أن يكون كائن قوي للغاية عشوائيًا مرنًا الجيل: القيم المنطقية ، جميع الأنواع الرقمية ، وحتى التوزيعات الغوسية. على سبيل المثال:
New Java.Util.Random (). Nextint (10)
له عيب ، أي أنه كائن. يجب استدعاء طريقته من خلال مثيل ، مما يعني أن مُنشئه يجب أن يطلق عليه أولاً. إذا كانت هناك ذاكرة كافية ، فإن التعبيرات مثل التعبيرات أعلاه مقبولة ؛
الحل البسيط الذي يمكن أن يتجنب إنشاء مثيل جديد في كل مرة يتمثل فيها رقم عشوائي في استخدام فئة ثابتة. ربما تكون قد فكرت في java.lang.math ، جيدًا ، نحن نحسن تهيئة java.lang.math. على الرغم من أن هذا المشروع منخفض ، إلا أنك تحتاج أيضًا إلى إجراء بعض اختبارات الوحدة البسيطة للتأكد من عدم حدوث خطأ.
على افتراض أن البرنامج يحتاج إلى إنشاء رقم عشوائي لتخزينه ، فإن المشكلة تأتي مرة أخرى. على سبيل المثال ، في بعض الأحيان يكون من الضروري تشغيل البذور أو حمايتها ، ويتم استخدام الرقم الداخلي لتخزين الحالة وحساب الرقم العشوائي التالي. في هذه الحالات الخاصة ، من غير المناسب مشاركة كائنات تم إنشاؤها عشوائيًا.
متزامنة
في بيئة تطبيق Java EE Multithed ، لا يزال من الممكن تخزين كائنات مثيل تم إنشاؤها عشوائيًا في فئة أو فئة تنفيذ أخرى كخاصية ثابتة. لحسن الحظ ، java.util.random آمن للخيط ، لذلك لا يوجد خطر من أن مكالمات الخيوط المتعددة ستدمر البذور.
شيء آخر يستحق النظر فيه هو مثيل multithed من Java.lang.Threadlocal. يتمثل النهج الكسول في تنفيذ مثيل واحد من خلال Java نفسها API.
على الرغم من أن Java لا توفر طريقة جيدة لإدارة مثيل واحد من java.util.random. ومع ذلك ، فإن Java 7 الذي طال انتظاره يوفر طريقة جديدة لتوليد أرقام عشوائية:
java.util.concurrent.throadlocalrandom.current (). NextInt (10)
يجمع API الجديد هذا بين مزايا نهجين أخريين: مثيل واحد/الوصول الثابت ، مرن مثل Math.Random (). ThreadLocalRandom هو أيضا أسرع من أي طريقة أخرى للتعامل مع التزامن العالي.
خبرة
يشير كريس ماراستي-جورج:
Math.Round (Math.Random () * 10)
اجعل التوزيع غير متوازن ، على سبيل المثال: 0.0 - 0.499999 سوف يتجول إلى 0 ، في حين أن 0.5 إلى 1.499999 سوف يدور إلى 1. لذا ، كيفية استخدام بناء جملة النمط القديم لتحقيق توزيع متوازن صحيح ، على النحو التالي:
Math.Floor (Math.Random () * 11)
لحسن الحظ ، إذا استخدمنا java.util.random أو java.util.concurrent.throadlocalrandom ، لا داعي للقلق بشأن ما سبق.
يقدم مشروع Java العملي بعضًا من الأضرار التي أجريت بشكل غير صحيح باستخدام java.util.random API. هذا الدرس يخبرنا بعدم استخدام:
Math.abs (rnd.nextint ()) ٪ n
والاستخدام:
rnd.nextint (n)
تعتبر YTHES أعلاه مقدمة ذات صلة بالأرقام العشوائية في Java ، وآمل أن تكون مفيدة لتعلم الجميع.