একটি পূর্ণসংখ্যা Math.random() * n
এবং Random.nextInt(n)
কোথায় মধ্যে পার্থক্য আছে n
?
একটি পূর্ণসংখ্যা Math.random() * n
এবং Random.nextInt(n)
কোথায় মধ্যে পার্থক্য আছে n
?
উত্তর:
গিলির সাথে সংযুক্ত যে সান ফোরাম পোস্ট থেকে " উভয়ই আরও দক্ষ এবং কম পক্ষপাতী " তার বিশদ ব্যাখ্যা এখানে রয়েছে :Random.nextInt(n)
Math.random() * n
ম্যাথ.র্যান্ডম () অভ্যন্তরীণভাবে র্যান্ডম.নেক্সটডুবল () ব্যবহার করে।
এলোমেলো.নেক্সটডুবল () তার ম্যান্টিসায় প্রায় সমানভাবে বিট বিতরণ করেছে এমন একটি ডাবল উত্পন্ন করতে দুবার র্যান্ডম.নেক্সট () ব্যবহার করে, সুতরাং এটি 0 থেকে 1- (2 ^ -53) পরিসরে অভিন্নভাবে বিতরণ করা হয়।
র্যান্ডম.নেক্সট ইন্ট (এন) রেন্ডম.নেক্সট () গড়ের তুলনায় দ্বিগুণেরও কম ব্যবহার করে - এটি একবার ব্যবহার করে এবং যদি প্রাপ্ত মানটি ম্যাক্সএনটিটির নীচে সর্বোচ্চ এন এর একাধিকের উপরে থাকে তবে এটি আবার চেষ্টা করে, অন্যথায় মানটি মডুলো এন (এটি ফেরত দেয়) MAX_INT এর নীচে সর্বাধিক এন এর একাধিক মানগুলির উপরে বাধা দেয়) সুতরাং 0 থেকে n-1 পরিসরে সমানভাবে বিতরণ করা একটি মান ফেরত দেওয়া।
6 দ্বারা স্কেলিংয়ের আগে, ম্যাথআরন্ডম () এর আউটপুট 2 uniform 53 সম্ভাব্য মানগুলির মধ্যে একটি uniform
By দ্বারা স্কেলিং সম্ভব মানগুলির সংখ্যার পরিবর্তন করে না এবং এরপরে একটি কাস্টিং এ ছয়টি 'বালতি' (0, 1, 2, 3, 4, 5) এর মধ্যে একটিতে এই মানগুলিকে বাধ্য করে, প্রতিটি বালতি হয় বিস্তৃত রেঞ্জের সাথে সম্পর্কিত 1501199875790165 বা 1501199875790166 সম্ভাব্য মানগুলির (6 হিসাবে 2 ^ 53 এর ডিসভিজার নয়)। এর অর্থ হ'ল পর্যাপ্ত সংখ্যক ডাইস রোলগুলির জন্য (বা পর্যাপ্ত সংখ্যক পক্ষের সাথে একটি ডাই), ডাই নিজেকে বড় বালতির দিকে পক্ষপাতদুষ্ট বলে দেখায়।
এই প্রভাবটি প্রদর্শিত হওয়ার জন্য আপনি খুব দীর্ঘ সময় রোলিং ডাইস অপেক্ষা করবেন।
ম্যাথআর্যান্ডম () এর জন্য প্রায় দ্বিগুণ প্রক্রিয়াজাতকরণ প্রয়োজন হয় এবং এটি সিঙ্ক্রোনাইজেশন সাপেক্ষে।
6
দিয়ে প্রতিস্থাপন 5
করুন: এটি "5-পক্ষপাতদুষ্ট" হবে। আপনি পাশের সাথে কিছু ভুল আছে তা লক্ষ্য করার আগে আপনি কয়েকবার ডাইস ফেলে দিতে পারেন। আপনি এলোমেলো জেনারেটরের সাথে কিছু ভুল হয়েছে তা লক্ষ্য করার আগে আপনি একটি অত্যন্ত পরিশীলিত পুঙ্খানুপুঙ্খ পরীক্ষা করতে বাধ্য হন।
Https://forums.oracle.com/forums/thread.jspa?messageID=6594485龵 অনুযায়ী Random.nextInt(n)
উভয়ই বেশি দক্ষ এবং কম পক্ষপাতিত্বীMath.random() * n
এই উদাহরণ অনুসারে Random.nextInt(n)
কম অনুমানযোগ্য আউটপুট রয়েছে তবে ম্যাথ.র্যান্ডম () * এন। [একটি ছদ্মবেশী অ্যারের চেয়ে দ্রুত সাজানো অ্যারে] অনুসারে] [1] আমি মনে করি আমরা বলতে পারি র্যান্ডম.নেক্সটইন্ট (এন) এর পূর্বাভাস দেওয়া শক্ত ।
র্যান্ডমক্লাস ব্যবহার করে: সময়: 328 মাইলসেকেন্ড।
ম্যাথরাস্যান্ডম ব্যবহার করে: সময়: 187 মাইলসেকেন্ড।
package javaFuction;
import java.util.Random;
public class RandomFuction
{
static int array[] = new int[9999];
static long sum = 0;
public static void usingMathsRandom() {
for (int i = 0; i < 9999; i++) {
array[i] = (int) (Math.random() * 256);
}
for (int i = 0; i < 9999; i++) {
for (int j = 0; j < 9999; j++) {
if (array[j] >= 128) {
sum += array[j];
}
}
}
}
public static void usingRandomClass() {
Random random = new Random();
for (int i = 0; i < 9999; i++) {
array[i] = random.nextInt(256);
}
for (int i = 0; i < 9999; i++) {
for (int j = 0; j < 9999; j++) {
if (array[j] >= 128) {
sum += array[j];
}
}
}
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
usingRandomClass();
long end = System.currentTimeMillis();
System.out.println("usingRandomClass " + (end - start));
start = System.currentTimeMillis();
usingMathsRandom();
end = System.currentTimeMillis();
System.out.println("usingMathsRandom " + (end - start));
}
}
Math.random()