1. छद्म आयामी संख्याएँ

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

वास्तव में, वास्तव में यादृच्छिक संख्या प्राप्त करना कठिन है। वास्तव में, यह इतना कठिन है कि विशेष गणितीय सहसंसाधकों को कुछ कंप्यूटरों में बनाया जाता है ताकि वे संख्याएँ उत्पन्न की जा सकें जो वास्तविक यादृच्छिकता के लिए सभी आवश्यकताओं को पूरा करती हैं।

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

छद्म यादृच्छिक संख्याओं का अनुक्रम उत्पन्न करने के लिए कई एल्गोरिदम हैं। उनमें से लगभग सभी पिछली संख्या और कुछ अतिरिक्त सहायक संख्याओं के आधार पर अगली यादृच्छिक संख्या उत्पन्न करते हैं।

1000उदाहरण के लिए, यह प्रोग्राम गैर-दोहराए जाने वाले नंबर प्रदर्शित करेगा :

public class Main
{
   public static int a = 41;
   public static int c = 11119;
   public static int m = 11113;
   public static int seed = 1;

   public static int getNextRandom()
   {
     seed = (a * seed + c) % m;
     return seed;
   }

   public static void main(String[] args)
   {
     for (int i = 0; i < 1000; i++)
     {
       System.out.println(getNextRandom());
     }
   }
}

वैसे, हम यहां छद्म यादृच्छिक संख्या के बारे में बात नहीं कर रहे हैं। हम छद्म यादृच्छिक संख्याओं के अनुक्रम के बारे में बात कर रहे हैं। किसी एक संख्या को देखकर यह बताना असंभव है कि यह यादृच्छिक है या नहीं।

दरअसल, यादृच्छिक संख्या प्राप्त करने के कई तरीके हैं:

public static int getRandomNumber()
{
   return 4; // Here's a random number (we got it by rolling a die)
}

2.Math.random()

जावा में, Mathकक्षा में एक विशेष विधि होती है जो एक यादृच्छिक संख्या लौटाती है। और जैसा कि आप अनुमान लगा सकते हैं, विधि कहलाती है random। सामान्य तौर पर, यह इस विधि को कॉल करने जैसा दिखता है:

Math.random()

0यह विधि कोई पैरामीटर नहीं लेती है और से तक की सीमा में छद्म यादृच्छिक वास्तविक संख्या लौटाती है 1। संख्या 1 स्वयं श्रेणी में शामिल नहीं है।

उदाहरण:

कोड कंसोल आउटपुट
public class Main
{
   public static void main(String[] args)
   {
     for (int i = 0; i < 10; i++)
     {
       System.out.println(Math.random());
     }
   }
}
0.9703753971734451
0.09979423801773157
0.994048474709053
0.2852203204171295
0.13551248551226025
0.3128547131272822
0.5342480554101412
0.6817369932044817
0.1840767788961758
0.06969563435451254

लेकिन क्या होगा अगर यह तरीका आपकी जरूरत के हिसाब से नहीं है? मान लीजिए, आप एक ऐसा प्रोग्राम लिखना चाहते हैं जो छह-तरफा पासे को रोल करने का अनुकरण करता है। श्रेणी 0..1 में वास्तविक संख्या के बजाय, आप श्रेणी 1..6 में यादृच्छिक पूर्णांक कैसे प्राप्त करते हैं?

यह वास्तव में काफी आसान है।

सबसे पहले, आपको रेंज [0, 1)को पर मैप करना होगा [0, 6)random()ऐसा करने के लिए, बस द्वारा लौटाए गए परिणाम को गुणा करें 6। बेशक, पूर्णांक प्राप्त करने के लिए, आपको राउंड अप करने की आवश्यकता है:

कोड कंसोल आउटपुट
public class Main
{
   public static int getRandomDieNumber()
   {
      return (int) (Math.random() * 6);
   }

   public static void main(String[] args)
   {
      for (int i = 0; i < 10; i++)
      {
         int x = getRandomDieNumber();
         System.out.println(x);
      }
   }
}
5
2
3
3
2
4
1
1
5
0

सहित getRandomDieNumber()श्रेणी में एक यादृच्छिक पूर्णांक देता है । 0..5लेकिन यह सेट में कोई संख्या नहीं होगी 1, 2, 3, 4, 5, 6। यह सेट में एक नंबर होगा 0, 1, 2, 3, 4, 5

यदि आपको जो चाहिए वह सेट में संख्याएं हैं 1, 2, 3, 4, 5, 6, तो बस एक को यादृच्छिक संख्याओं में जोड़ें:

कोड कंसोल आउटपुट
public class Main
{
   public static int getRandomDieNumber()
   {
      return (int) (Math.random() * 6) + 1;
   }

   public static void main(String[] args)
   {
     for (int i = 0; i < 10; i++)
     {
       int x = getRandomDieNumber();
       System.out.println(x);
     }
   }
}
3
2
1
3
6
5
6
1
6
6

अब यह एकदम सही है!



3. Randomवर्ग

जावा में एक विशेष Randomवर्ग है जो छद्म यादृच्छिक संख्याओं के अनुक्रम को समाहित करता है। आप कक्षा के कई ऑब्जेक्ट बना सकते हैं Random। इनमें से प्रत्येक वस्तु छद्म यादृच्छिक संख्याओं का अपना अनुक्रम उत्पन्न करेगी।

यह बहुत दिलचस्प तरीकों के साथ एक सुपर दिलचस्प वर्ग है। आइए सबसे सरल से शुरू करें।

double nextDouble()

0.0यह विधि - श्रेणी में एक यादृच्छिक वास्तविक संख्या लौटाती है 1.0। यह विधि के समान ही है Math.random()। और कोई आश्चर्य नहीं, क्योंकि Math.random()विधि केवल किसी वस्तु nextDouble()पर विधि को बुलाती है।Random

float nextFloat()

यह विधि विधि के समान ही है nextDouble(), लेकिन लौटाई गई यादृच्छिक संख्या एक है float0.0यह - के दायरे में भी आता है 1.0। और, हमेशा की तरह जावा में, श्रेणी में संख्या 1.0ही शामिल नहीं होती है।

Random r = new Random();
float f = r.nextFloat();

int nextInt(int max)

यह विधि श्रेणी में एक यादृच्छिक पूर्णांक[0, max) लौटाती है । 0सीमा में शामिल है, लेकिन maxनहीं है।

दूसरे शब्दों में, यदि आप सेट में एक यादृच्छिक संख्या प्राप्त करना चाहते हैं 1, 2, 3, 4, 5, 6, तो आपको दिए गए यादृच्छिक संख्या में एक जोड़ना होगा:

Random r = new Random();
int x = r.nextInt(6) + 1;

int nextInt()

यह विधि पिछले वाले के समान है, लेकिन इसमें कोई पैरामीटर नहीं होता है। तो इसके वापसी मूल्यों की सीमा क्या है? से -2 billionतक +2 billion

ठीक है, सटीक होने के लिए, से -2147483648से +2147483647

long nextLong()

यह विधि विधि के समान है nextInt(), लेकिन रिटर्न वैल्यू longएस की पूरी संभावित सीमा में कहीं गिर जाएगी।

boolean nextBoolean()

यह विधि एक यादृच्छिक booleanमान लौटाती है: falseया true। यह बहुत सुविधाजनक है जब आपको यादृच्छिक बूलियन मानों का एक लंबा अनुक्रम प्राप्त करने की आवश्यकता होती है।

void nextBytes(byte[] data)

यह विधि कुछ भी नहीं लौटाती है (चूंकि रिटर्न प्रकार है void)। इसके बजाय, यह पारित सरणी को यादृच्छिक मानों से भरता है। यह बहुत आसान है जब आपको यादृच्छिक डेटा से भरे बड़े बफर की आवश्यकता होती है।

double nextGaussian()

0.0यह विधि - श्रेणी में एक यादृच्छिक वास्तविक संख्या लौटाती है 1.0। हालाँकि, संख्याएँ इस श्रेणी में समान रूप से वितरित नहीं हैं। इसके बजाय, वे एक सामान्य वितरण का पालन करते हैं ।

श्रेणी के मध्य के निकट के मान ( 0.5) श्रेणी के अंत के मानों की तुलना में अधिक बार घटित होंगे।

यादृच्छिक वर्ग

हमारे मामले में, मूल्य वितरण का शिखर होगा0.5