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

यादृच्छिक संख्याएँ हर जगह दिखाई देती हैं Javaयूनिट-टेस्ट डेटा और डाइस-रोल गेम से लेकर सेशन टोकन और फेरबदल किए गए डेक तक, सभी प्रकार के गेमों में रैंडम नंबर जनरेट करने का तरीका इस ट्यूटोरियल में बताया गया है। Java स्टैंडर्ड लाइब्रेरी में मौजूद हर विकल्प का उपयोग करना और काम के लिए सही विकल्प का चुनाव कैसे करें।
में यादृच्छिक संख्या उत्पन्न करें Java
RSI Java मानक लाइब्रेरी यादृच्छिक संख्या उत्पन्न करने के चार सामान्य तरीके प्रदान करती है:
java.util.Randomयह एक सामान्य प्रयोजन वर्ग है। यह बूलियन, इंट, लॉन्ग, फ्लोट और डबल मान उत्पन्न करता है, जैसे कि विधियों के माध्यम से।nextInt,nextLong, तथाnextDouble.Math.randomयह एक स्टैटिक हेल्पर है जो साझा वेरिएबल का उपयोग करके 0.0 (शामिल) और 1.0 (शामिल नहीं) के बीच एक डबल मान लौटाता है।Randomआंतरिक रूप से।ThreadLocalRandominjava.util.concurrentयह प्रत्येक थ्रेड को अपना स्वयं का जनरेटर देता है, इसलिए कई थ्रेड एक ही इंस्टेंस पर प्रतिस्पर्धा नहीं करते हैं।SecureRandominjava.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 बनाया गया है objGenerator। nextInt(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 क्योंकि इसमें अधिक शक्तिशाली एल्गोरिदम और बेहतर सीड डेटा का उपयोग किया गया है। इसे सुरक्षा संबंधी कार्यों के लिए आरक्षित रखें और गेम, सिमुलेशन और परीक्षण डेटा के लिए तेज़ जनरेटर का उपयोग करें।
