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()

Java मध्ये, 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वर्ग

Java मध्ये एक विशेष Randomवर्ग आहे जो छद्म यादृच्छिक संख्यांचा क्रम समाविष्ट करतो. तुम्ही वर्गातील अनेक वस्तू तयार करू शकता Random. यातील प्रत्येक वस्तू स्वतःच्या स्यूडोरॅंडम संख्यांचा क्रम तयार करेल.

बर्याच मनोरंजक पद्धतींसह हा एक अतिशय मनोरंजक वर्ग आहे. चला सर्वात सोप्यापासून सुरुवात करूया.

double nextDouble()

ही पद्धत श्रेणीतील एक यादृच्छिक वास्तविक संख्या मिळवते 0.0- 1.0. हे पद्धतशी अगदी समान आहे Math.random(). आणि आश्चर्य नाही, कारण Math.random()पद्धत फक्त nextDouble()ऑब्जेक्टवर पद्धत कॉल करते Random.

float nextFloat()

ही पद्धत या पद्धतीसारखीच आहे nextDouble(), परंतु परत केलेला यादृच्छिक क्रमांक a आहे float. ते श्रेणीमध्ये देखील आहे 0.0- 1.0. आणि, नेहमीप्रमाणे Java मध्ये, श्रेणीमध्ये 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(), परंतु परतावा मूल्य longs च्या संपूर्ण संभाव्य श्रेणीमध्ये कुठेतरी कमी होईल.

boolean nextBoolean()

ही पद्धत यादृच्छिक booleanमूल्य देते: falseकिंवा true. जेव्हा तुम्हाला यादृच्छिक बूलियन व्हॅल्यूजचा दीर्घ क्रम मिळणे आवश्यक असते तेव्हा हे अतिशय सोयीचे असते.

void nextBytes(byte[] data)

ही पद्धत काहीही परत करत नाही (रिटर्न प्रकार असल्याने void). त्याऐवजी, ते यादृच्छिक मूल्यांसह पास केलेले अॅरे भरते. जेव्हा तुम्हाला यादृच्छिक डेटाने भरलेल्या मोठ्या बफरची आवश्यकता असते तेव्हा हे खूप सोपे आहे.

double nextGaussian()

ही पद्धत श्रेणीतील एक यादृच्छिक वास्तविक संख्या मिळवते 0.0- 1.0. तथापि, या श्रेणीमध्ये संख्या समान रीतीने वितरीत केल्या जात नाहीत. त्याऐवजी, ते सामान्य वितरणाचे अनुसरण करतात .

श्रेणीच्या मध्यभागी असलेली मूल्ये ( 0.5) श्रेणीच्या शेवटी असलेल्या मूल्यांपेक्षा अधिक वेळा आढळतील.

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

आमच्या बाबतीत, मूल्य वितरणाच्या शिखरावर असेल0.5