में यादृच्छिक संख्या कैसे उत्पन्न करें Java

⚡ स्मार्ट सारांश

यादृच्छिक संख्याएँ Java ये चार संबंधित मानक लाइब्रेरी विकल्पों से आते हैं: रैंडम क्लास, मैथ.रैंडम, थ्रेडलोकलरैंडम और सिक्योररैंडम, जिनमें से प्रत्येक वास्तविक अनुप्रयोगों के लिए गति, थ्रेड सुरक्षा और क्रिप्टोग्राफिक मजबूती का एक अलग मिश्रण प्रदान करता है।

  • 🎲 यादृच्छिक वर्ग: java.util.Random nextInt, nextLong, next को एक्सपोज़ करता हैDoubleऔर सामान्य आदिम प्रकारों के लिए nextBoolean।
  • 🧮 गणित.यादृच्छिक: Math.random एक साझा Random इंस्टेंस का उपयोग करके 0.0 (शामिल) और 1.0 (शामिल नहीं) के बीच एक डबल मान लौटाता है।
  • 🎯 अनुकूलित श्रेणियां: किसी भी न्यूनतम और अधिकतम सीमा के भीतर मान उत्पन्न करने के लिए nextInt को एक सीमा पास करें या Math.random को स्केल करें।
  • 🧵 धागे की सुरक्षा: java.util.concurrent में ThreadLocalRandom प्रत्येक थ्रेड को अपना स्वयं का जनरेटर देता है और प्रतिस्पर्धा की स्थिति में साझा रैंडम की तुलना में बेहतर प्रदर्शन करता है।
  • 🔐 सुरक्षा: java.security में मौजूद SecureRandom, पासवर्ड, टोकन और सेशन कुंजी के लिए क्रिप्टोग्राफिक रूप से मजबूत मान उत्पन्न करता है।
  • 🌱 reproducibility: एक निश्चित लंबाई के साथ रैंडम सीडिंग करने से परीक्षण और सिमुलेशन सभी रन में नियतात्मक हो जाते हैं।

में यादृच्छिक संख्या कैसे उत्पन्न करें Java

यादृच्छिक संख्याएँ हर जगह दिखाई देती हैं Javaयूनिट-टेस्ट डेटा और डाइस-रोल गेम से लेकर सेशन टोकन और फेरबदल किए गए डेक तक, सभी प्रकार के गेमों में रैंडम नंबर जनरेट करने का तरीका इस ट्यूटोरियल में बताया गया है। Java स्टैंडर्ड लाइब्रेरी में मौजूद हर विकल्प का उपयोग करना और काम के लिए सही विकल्प का चुनाव कैसे करें।

में यादृच्छिक संख्या उत्पन्न करें Java

RSI Java मानक लाइब्रेरी यादृच्छिक संख्या उत्पन्न करने के चार सामान्य तरीके प्रदान करती है:

  • java.util.Random यह एक सामान्य प्रयोजन वर्ग है। यह बूलियन, इंट, लॉन्ग, फ्लोट और डबल मान उत्पन्न करता है, जैसे कि विधियों के माध्यम से। nextInt, nextLong, तथा nextDouble.
  • Math.random यह एक स्टैटिक हेल्पर है जो साझा वेरिएबल का उपयोग करके 0.0 (शामिल) और 1.0 (शामिल नहीं) के बीच एक डबल मान लौटाता है। Random आंतरिक रूप से।
  • ThreadLocalRandom in java.util.concurrent यह प्रत्येक थ्रेड को अपना स्वयं का जनरेटर देता है, इसलिए कई थ्रेड एक ही इंस्टेंस पर प्रतिस्पर्धा नहीं करते हैं।
  • SecureRandom in java.security यह पासवर्ड, सेशन आइडेंटिफ़ायर और कुंजियों के लिए क्रिप्टोग्राफ़िक रूप से मज़बूत छद्म-यादृच्छिक संख्याएँ उत्पन्न करता है।

नीचे दिए गए अनुभागों में दिखाया गया है कि प्रत्येक विधि से दस यादृच्छिक संख्याएँ कैसे उत्पन्न की जा सकती हैं।

उदाहरण: का उपयोग करके यादृच्छिक संख्या उत्पन्न करें Java यादृच्छिक वर्ग

पहले उदाहरण में उपयोग किया गया है java.util.Random 0 से 99 तक की सीमा में दस पूर्णांक उत्पन्न करने के लिए:

import java.util.Random;

public class RandomNumbers {
    public static void main(String[] args) {
        Random objGenerator = new Random();
        for (int iCount = 0; iCount < 10; iCount++) {
            int randomNumber = objGenerator.nextInt(100);
            System.out.println("Random No : " + randomNumber);
        }
    }
}

आउटपुट:

Random No : 17
Random No : 57
Random No : 73
Random No : 48
Random No : 68
Random No : 86
Random No : 34
Random No : 97
Random No : 73
Random No : 18

का एक उदाहरण Random बनाया गया है objGeneratornextInt(int bound) यह विधि 0 (शामिल) और दी गई सीमा (अनन्य) के बीच एक मान लौटाती है, इसलिए nextInt(100) यह 0 से 99 तक के मान देता है। अनुक्रम को पुनरुत्पादित करने योग्य बनाने के लिए, कंस्ट्रक्टर को एक सीड पास करें, उदाहरण के लिए new Random(42)एक ही बीज से हमेशा एक ही क्रम उत्पन्न होता है, जो परीक्षणों और सिमुलेशन में उपयोगी होता है।

उदाहरण: उपयोग करना Java गणित.यादृच्छिक

0.0 से 1.0 की सीमा में दस यादृच्छिक मान उत्पन्न करने के लिए, स्टैटिक फ़ंक्शन को कॉल करें। Math.random एक विधि के अंदर पाशयह जनरेटर ऑब्जेक्ट बनाए बिना रैंडम डबल प्राप्त करने का सबसे तेज़ तरीका है:

public class DemoRandom {
    public static void main(String[] args) {
        for (int xCount = 0; xCount < 10; xCount++) {
            System.out.println(Math.random());
        }
    }
}

आउटपुट:

0.46518450373334297
0.14859851177803485
0.5628391820492477
0.6323378498048606
0.1740198445692248
0.9140544122258946
0.9167350036262347
0.49251219841030147
0.7426056725722353
0.2039418871298877

हुड के नीचे, Math.random एक एकल स्थिर बनाता है Random पहले उपयोग और कॉल पर nextDouble इस पर। वह एकल साझा जनरेटर डेमो के लिए तो ठीक है, लेकिन भारी मल्टीथ्रेडेड लोड के तहत एक बाधा बन जाता है, जिसका समाधान अगले अनुभागों में किया गया है।

एक अनुकूलित सीमा में एक यादृच्छिक संख्या उत्पन्न करें

वास्तविक प्रोग्रामों को आमतौर पर एक विशिष्ट सीमा के भीतर एक यादृच्छिक मान की आवश्यकता होती है, जैसे कि पासे के लिए 1 और 6 के बीच का पूर्णांक या सिमुलेशन के लिए 10.0 और 20.0 के बीच का डबल मान। दो पैटर्न लगभग हर मामले को कवर करते हैं।

न्यूनतम और अधिकतम (दोनों शामिल) के बीच का यादृच्छिक पूर्णांक:

import java.util.Random;

public class RangeDemo {
    public static void main(String[] args) {
        Random rnd = new Random();
        int min = 1;
        int max = 6;
        // nextInt(max - min + 1) returns 0..(max-min), then shift by min
        int dice = rnd.nextInt(max - min + 1) + min;
        System.out.println("Dice roll : " + dice);
    }
}

न्यूनतम और अधिकतम के बीच यादृच्छिक डबल:

double min = 10.0;
double max = 20.0;
double value = min + (max - min) * Math.random();
System.out.println("Value : " + value);

दोनों पैटर्न जनरेटर की मूल सीमा से एक मान लेकर, उसे लक्ष्य सीमा की चौड़ाई तक स्केल करके और न्यूनतम मान से ऊपर की ओर शिफ्ट करके काम करते हैं। यदि आप Java 8 या उसके बाद के संस्करणों में, वही परिणाम नए संस्करण के माध्यम से उपलब्ध है। ints, longs, तथा doubles स्ट्रीम विधियों पर Random, उदाहरण के लिए rnd.ints(10, 1, 7).forEach(System.out::println) दस पासे फेंकने के लिए।

मल्टीथ्रेडेड के लिए थ्रेडलोकलरैंडम Code

एक साझा Random यह थ्रेड-सेफ है लेकिन प्रतिस्पर्धा की स्थिति में धीमा है क्योंकि प्रत्येक थ्रेड को एक ही आंतरिक सीड पर सिंक्रनाइज़ करना होता है। ThreadLocalRandomजोड़ा गया Java 7 और में रह रहे हैं java.util.concurrentयह प्रत्येक थ्रेड को अपना स्वयं का जनरेटर देता है, जिससे लॉक को लेकर कोई विवाद नहीं होता है।

import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalDemo {
    public static void main(String[] args) {
        // random int in [1, 100]
        int i = ThreadLocalRandom.current().nextInt(1, 101);

        // random long in [1000, 5000]
        long l = ThreadLocalRandom.current().nextLong(1000L, 5001L);

        // random double in [0.0, 1.0)
        double d = ThreadLocalRandom.current().nextDouble();

        System.out.println(i + " " + l + " " + d);
    }
}

उपयोग ThreadLocalRandom.current() वर्कर थ्रेड्स, पैरेलल स्ट्रीम्स और किसी भी समवर्ती कार्य के भीतर। ध्यान दें कि setSeed फेंकता UnsupportedOperationExceptionइसलिए, पुनरुत्पादन के लिए सीडिंग समर्थित नहीं है; यदि आपको एक निश्चित सीड की आवश्यकता है, तो सादे तरीके का उपयोग करें। Random.

सुरक्षा-संवेदनशील यादृच्छिक गणनाओं के लिए सिक्योररैंडम Numbers

के उदाहरण हैं Random और ThreadLocalRandom ये क्रिप्टोग्राफिक रूप से सुरक्षित नहीं हैं। कुछ आउटपुट नमूनों को देखते हुए, एक हमलावर आंतरिक स्थिति का पुनर्निर्माण कर सकता है और भविष्य के मूल्यों की भविष्यवाणी कर सकता है। पासवर्ड, सेशन टोकन, सॉल्ट वैल्यू और क्रिप्टोग्राफिक कुंजी के लिए, इनका उपयोग करें। java.security.SecureRandom इसके बजाय, यह ऑपरेटिंग सिस्टम के एंट्रॉपी पूल से बीज सामग्री प्राप्त करता है और ऐसे मान उत्पन्न करता है जिनकी भविष्यवाणी करना मुश्किल होता है।

import java.security.SecureRandom;

public class SecureDemo {
    public static void main(String[] args) {
        SecureRandom secure = new SecureRandom();

        byte[] token = new byte[16];
        secure.nextBytes(token);          // 128-bit random token

        int otp = secure.nextInt(1_000_000); // 6-digit one-time code

        System.out.println("OTP : " + String.format("%06d", otp));
    }
}

SecureRandom से धीमा है Random क्योंकि इसमें अधिक शक्तिशाली एल्गोरिदम और बेहतर सीड डेटा का उपयोग किया गया है। इसे सुरक्षा संबंधी कार्यों के लिए आरक्षित रखें और गेम, सिमुलेशन और परीक्षण डेटा के लिए तेज़ जनरेटर का उपयोग करें।

अक्सर पूछे जाने वाले प्रश्न

java.util.Random का एक इंस्टेंस बनाएं और nextInt, nextLong, next को कॉल करेंDoubleया nextBoolean का उपयोग करें। एक त्वरित और संक्षिप्त समाधान के लिए, Math.random का उपयोग करें जो 0.0 और 1.0 के बीच एक डबल मान लौटाता है। ये दोनों तरीके मानक लाइब्रेरी में उपलब्ध हैं।

पूर्णांकों के लिए random.nextInt(max – min + 1) + min, या डबल्स के लिए min + (max – min) * Math.random() को कॉल करें। ये फ़ॉर्मूले जनरेटर रेंज को आपकी लक्षित विंडो के अनुसार स्केल करते हैं और न्यूनतम मान से शिफ्ट करते हैं।

Random एक पूर्ण क्लास है जिसमें कई प्राथमिक प्रकारों के लिए विधियाँ हैं और यह सीडिंग का समर्थन करती है। Math.random एक स्टैटिक हेल्पर है जो 0.0 और 1.0 के बीच एक डबल मान लौटाता है। आंतरिक रूप से, Math.random एक साझा Random इंस्टेंस को कॉल करता है।

हाँ, लेकिन समवर्ती कॉल एक ही आंतरिक सीड पर प्रतिस्पर्धा करते हैं, जिससे थ्रेडेड कोड धीमा हो जाता है। प्रत्येक थ्रेड को अपना जनरेटर देने और इस प्रतिस्पर्धा को दूर करने के लिए java.util.concurrent से ThreadLocalRandom.current() का उपयोग करें।

Random कंस्ट्रक्टर को एक निश्चित लॉन्ग मान पास करें, उदाहरण के लिए new Random(42), या setSeed(42) को कॉल करें। जेनरेटर हर बार एक ही अनुक्रम उत्पन्न करेगा, जो दोहराए जाने योग्य परीक्षणों और सिमुलेशन के लिए आवश्यक है।

पासवर्ड, सेशन टोकन, सॉल्ट वैल्यू, वन-टाइम कोड और क्रिप्टोग्राफिक कुंजी जैसी जानकारी के लिए, जब भी मान का अनुमान लगाना आवश्यक हो, SecureRandom का उपयोग करें। Plain Random तेज़ तो है, लेकिन इसका अनुमान लगाया जा सकता है, इसलिए सुरक्षा कार्यों के लिए यह असुरक्षित है।

मशीन लर्निंग फ्रेमवर्क वज़न निर्धारित करने, प्रशिक्षण डेटा को फेरबदल करने और सत्यापन सेट को विभाजित करने के लिए छद्म-यादृच्छिक जनरेटर का उपयोग करते हैं। एक निश्चित सीड तय करने से प्रयोगों को दोहराने योग्य बनाया जा सकता है, जिससे टीमें मॉडल रन की तुलना कर सकती हैं और परिणामों को विश्वसनीय रूप से डीबग कर सकती हैं।

हाँ। GitHub Copilot, Random, ThreadLocalRandom और SecureRandom स्निपेट्स को तैयार करता है, जो रेंज-स्केलिंग फ़ार्मुलों से मेल खाते हैं, और JUnit परीक्षण। Revप्रत्येक सुझाव की समीक्षा करके पुष्टि करें कि चयनित क्लास उपयोग के मामले के लिए उपयुक्त है, विशेष रूप से सुरक्षा-संवेदनशील कोड के लिए।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: