سؤال

بعد قراءة هذا الجواب:أفضل طريقة لاختيار عشوائي فرعية من مجموعة ؟

جعلني أتساءل كيف يمكن للمرء اختيار عشوائي في جافا ؟

و لا أقول استخدام النظام.وإذا ما اتخذت() أو نظام.nanoTime().قراءة هذه المادة لمعرفة لماذا لا.

هذا سؤال صعب, ولكن اسمحوا لي أن تجعل من الصعب.دعونا نقول كنت بحاجة إلى توليد عشوائي دون الاتصال بالإنترنت ، دون استخدام مدخلات المستخدم (أي لا يوجد واجهة المستخدم الرسومية) ، يجب أن يكون عبر منصة (ولذلك لا JNI الوصول إلى الأجهزة).

هناك بعض JVM المتغيرات يمكننا مراقبة كمصدر من العشوائية?

يمكن أن يتم ذلك ؟ أم أنه مستحيل ؟

هل كانت مفيدة؟

المحلول

نلقي نظرة على Uncommons الرياضيات (الكشف الكامل:كتبت ذلك).يجب أن تحل معظم المشاكل سيكون لديك أي وقت مضى مع أرقام عشوائية في جاوة.

حتى إذا كنت لا تستخدم ذلك يجب أن تكون قادرا على الحصول على بعض الأفكار من مختلف SeedGenerator تطبيقات توفرها.في الأساس, ومن التخلف إلى استخدام /ديف/عشوائي.إذا لا وجود لها (مثلا ، ويندوز) إما يحاول تحميل البيانات من random.org أو أنه يستخدم SecureRandom.generateSeed.

أعتقد SecureRandom.generateSeed هو أفضل ما يمكنك القيام به من دون الاعتماد على أي منصة محددة أو على الإنترنت.

نصائح أخرى

الجمع بين System.currentTimeMillis() مع العالمي لمكافحة التي زيادة في كل مرة تولد البذور.استخدام AtomicLong من أجل التصدي لذلك يمكنك زيادة مع كفاءة موضوع السلامة.

"الجمع" لا يعني "إضافة" أو "xor" لأنه من السهل جدا للحصول على التكرارات.بدلا من تجزئة.هل يمكن الحصول على معقد و الاشياء طويلة العداد في مثل16 بايت و MD5, ولكن أنا على الأرجح استخدام إصدار 64 بت من أدلر CRC أو بعض الأخرى 64 بت CRC.

أم ، أن المقال يقول أن 32 بت بذور سيئة ، ولكن 64 بت بذور جيدة.النظام.وإذا ما اتخذت() 64-بت البذور.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top