ম্যাথ.আরন্ডম () বনাম র্যান্ডম.নেক্সট ইনট (ইনট)


135

একটি পূর্ণসংখ্যা Math.random() * nএবং Random.nextInt(n)কোথায় মধ্যে পার্থক্য আছে n?


আমি গণিত জানি না, তবে আমি জানি যে আপনি যদি ব্যবহার করেন তবে Math.random()
ফাইন্ডব্যাগগুলি

3
মনে রাখবেন র্যান্ডমটির কোনও স্থির পদ্ধতি নেই, সুতরাং ব্যবহার করুন: (নতুন র‌্যান্ডম ()) next পরেরটি (এন)। ম্যাথের জন্য অনুরূপ পূর্ণসংখ্যার ব্যবহার উত্পন্ন করতে: ম্যাথ.ফ্লুর ((ম্যাথ.র্যান্ডম () * এন) +1);
দিমিত্রি দেওয়ালে

উত্তর:


169

গিলির সাথে সংযুক্ত যে সান ফোরাম পোস্ট থেকে " উভয়ই আরও দক্ষ এবং কম পক্ষপাতী " তার বিশদ ব্যাখ্যা এখানে রয়েছে :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 এর ডিসভিজার নয়)। এর অর্থ হ'ল পর্যাপ্ত সংখ্যক ডাইস রোলগুলির জন্য (বা পর্যাপ্ত সংখ্যক পক্ষের সাথে একটি ডাই), ডাই নিজেকে বড় বালতির দিকে পক্ষপাতদুষ্ট বলে দেখায়।

এই প্রভাবটি প্রদর্শিত হওয়ার জন্য আপনি খুব দীর্ঘ সময় রোলিং ডাইস অপেক্ষা করবেন।

ম্যাথআর্যান্ডম () এর জন্য প্রায় দ্বিগুণ প্রক্রিয়াজাতকরণ প্রয়োজন হয় এবং এটি সিঙ্ক্রোনাইজেশন সাপেক্ষে।


3
র্যান্ডম.নেক্সটইন্ট এবং নেক্সটডুবলও সিঙ্ক্রোনাইজেশনের বিষয়।
অ্যাড্রিয়ানো

এই প্রসঙ্গে, "কম পক্ষপাতদুষ্ট" এর অর্থ কী, দয়া করে?
ęXocę 웃 úepeúpa ツ

2
@ ĘXocę П úepúúpa ツ এর সহজ অর্থ হল যে নির্দিষ্ট সংখ্যাগুলি অন্যের তুলনায় আঁকার সম্ভাবনা বেশি। যেমন এটি অন্যের চেয়ে কিছু সংখ্যা বাছাই পক্ষপাতদুষ্ট হয় (অতএব পুরোপুরি এলোমেলো নয় বা যথেষ্ট পরিমাণে নমুনা আকারের ইউনিফর্ম দেওয়া হয়নি)
ফোর প্রেফেক্ট

1
নোট করুন যে এই থ্রেডে সর্বশেষ মন্তব্যটি জানিয়েছে: "বর্ণিত পক্ষপাতটি 2 ^ 53 এর একটি অংশ, তবে ব্যবহৃত পিআরএনজি সর্বাধিক চক্রের দৈর্ঘ্য মাত্র 2 ^ 48. সুতরাং আপনি অ্যাপ্লিকেশনটিতে যা দেখবেন তা হ'ল ডেটা অন্তর্নিহিত PRNG বিতরণ, পক্ষপাত নয়। " এটি এই দুটি বিষয়কে সমান বলে প্রমাণিত করবে
ডিজিটাল বিভ্রম

1
@ ĘXocę 웃 úepúúpa a একটি ডাইস কিউব 6দিয়ে প্রতিস্থাপন 5করুন: এটি "5-পক্ষপাতদুষ্ট" হবে। আপনি পাশের সাথে কিছু ভুল আছে তা লক্ষ্য করার আগে আপনি কয়েকবার ডাইস ফেলে দিতে পারেন। আপনি এলোমেলো জেনারেটরের সাথে কিছু ভুল হয়েছে তা লক্ষ্য করার আগে আপনি একটি অত্যন্ত পরিশীলিত পুঙ্খানুপুঙ্খ পরীক্ষা করতে বাধ্য হন।
ডেভিড হোর্ভাথ

27

আর একটি গুরুত্বপূর্ণ বিষয় হ'ল র্যান্ডম.নেক্সটইন্ট (এন) পুনরাবৃত্তিযোগ্য যেহেতু আপনি একই বীজের সাথে দুটি র্যান্ডম অবজেক্ট তৈরি করতে পারেন । ম্যাথ.রেন্ডম () দিয়ে এটি সম্ভব নয়।


14

Https://forums.oracle.com/forums/thread.jspa?messageID=6594485龵 অনুযায়ী Random.nextInt(n)উভয়ই বেশি দক্ষ এবং কম পক্ষপাতিত্বীMath.random() * n


19
আমি আসলে তার পোস্টের কিছু উদ্ধৃত করার এবং এখানে সামান্য সংক্ষেপের পরামর্শ দেব। লিঙ্কটি আপনার উত্তরের পরিপূরক হওয়া উচিত।
jjnguy

0

এই উদাহরণ অনুসারে 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));

    }

}

1
দ্বিতীয় লুপটিতে আপনি> = 50 পরীক্ষা করে দেখুন যা 50% এরও বেশি ক্ষেত্রে সত্য। এটি যদি বিবৃতিটি বেশিরভাগ সময় সত্য হয়ে থাকে, যা এটি আরও অনুমানযোগ্য করে তোলে। আপনার ফলাফলগুলি তাই আপনার উত্তরের পক্ষপাতদুষ্ট
নিউরন

এটি টাইপ ভুল ... 128 করুন দ্বিতীয় উদাহরণে আপনি একই ফলাফল পাবেন।
যতীন গোয়াল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.