CodeGym /Kurslar /Java SELF AZ /Təsadüfi ədədlər Java-da

Təsadüfi ədədlər Java-da

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. Psevdotəsadüfi ədədlər

Bəzən proqramçı sadə kimi görünə bilən tapşırıqlarla qarşılaşır: «axşam baxmaq üçün siyahıdan təsadüfi bir film seçmək», «lotereya qalibini müəyyən etmək», «smartfon silkələnərkən mahnı siyahısını qarışdırmaq», «mesajın şifrələnməsi üçün təsadüfi bir rəqəm seçmək», və hər dəfə çox təbiidir ki, belə bir sual yaranır: bunu necə etmək olar ki, həmin təsadüfi ədədi əldə edək?

Əslində, əgər sizə "həqiqətən təsadüfi bir ədəd" lazımdırsa, bunu etmək olduqca çətindir. Hətta bəzən kompüterlərə "həqiqi təsadüfiliyin" bütün tələblərini təmin edən xüsusi riyazi köməkçi prosessorlar quraşdırılır.

Ona görə proqramçılar öz həllərini tapıblar — psevdotəsadüfi ədədlər. Psevdotəsadüfi ədədlər - bunlar müəyyən bir ardıcıllıqdır, burada rəqəmlər ilk baxışdan təsadüfi görünür, amma bir mütəxəssis diqqətlə baxsa, müəyyən qanunauyğunluqları aşkar edə bilər. Məxfi sənədləri şifrələmək üçün bu ədədlər uyğun deyil, ancaq oyunda zər atanı imitasiya etmək üçün tam yerinə düşər.

Psevdotəsadüfi ədədlərin ardıcıllığını yaratmaq üçün bir çox alqoritm mövcuddur və onların demək olar ki, hamısı növbəti təsadüfi ədədi əvvəlki və digər yardımçı ədədlər əsasında yaradır.

Məsələn, bu proqram ekranda 1000 unikal rəqəm çıxaracaq:

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

Biz yalnız psevdotəsadüfi ədədlərdən bəhs etmirik, məhz bu cür rəqəmlərin ardıcıllığından danışırıq. Çünki yalnız bir rəqəmə baxaraq onun təsadüfi olduğunu təyin etmək mümkün deyil.

Təsadüfi bir ədəd müxtəlif yollarla əldə edilə bilər:

public static int getRandomNumber()
{
   return 4; // bu tam təsadüfi rəqəmdir (zərlər vasitəsi ilə qərarlaşdırılıb)
}

2. Math.random() metodu

Java-da Math sinifinin xüsusi bir metodu var ki, o təsadüfi rəqəm qaytarır. Yəqin ki, artıq təxmin edirsiniz, metodun adı random adlanır. Onu çağırmağın ümumi görünüşü belədir:

Math.random()

Bu metod heç bir parametr qəbul etmir, amma nəticəsində 0-dan 1-ə qədər olan psevdotəsadüfi onluq bir rəqəm qaytarır. Bununla belə, 1 diapazona daxil olmur.

Misal:

Kod Ekranda çıxış
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

Bəs sizə bu metod uyğun gəlmirsə və, məsələn, altı üzü olan bir zarı atmağı təqlid edən proqram yazmaq istəyirsinizsə necə? Necə 1..6 diapazonunda təsadüfi tam rəqəmlər, 0..1 diapazonundakı onluq rəqəmlər deyil?

Bu, əslində olduqca asandır.

Əvvəlcə [0,1) diapazonunu [0, 6) diapazonuna çevirmək lazımdır. Bunun üçün sadəcə random() funksiyasının nəticəsini 6-ya vurmaq kifayətdir. Bəs tam rəqəmlər almaq üçün, sadəcə bu nəticəni tamamlamaq lazımdır:

Kod Ekranda çıxış
public class Main
{
   public static int getRandomDiceNumber()
   {
      return (int) (Math.random() * 6);
   }

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

getRandomDiceNumber() funksiyası 0..5 diapazonundan təsadüfi tam rəqəm qaytarır. Ancaq bunlar 1,2,3,4,5,6 dəsti deyil, 0,1,2,3,4,5 dəsti olacaq.

Əgər məhz 1,2,3,4,5,6 dəstindən olan rəqəmlər tələb olunursa, sadəcə bütün təsadüfi rəqəmlərə bir əlavə etmək lazımdır:

Kod Ekranda çıxış
public class Main
{
   public static int getRandomDiceNumber()
   {
      return (int) (Math.random() * 6) + 1;
   }

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

İndi isə hər şey idealdır!



3. Random sinfi

Java-da xüsusi bir Random sinfi var ki, burada o, psevdotəsadüfi ədədlər ardıcıllığını özündə saxlayır. Bir neçə Random obyektini yarada bilərsiniz, və bu obyektlərin hər biri öz psevdotəsadüfi ədədlər ardıcıllığını yaradacaq.

Bu, çox maraqlı bir sinifdir və onun çox maraqlı metodları var. Gəlin ən sadə metodlardan başlayaq:

double nextDouble() metodu

Bu metod 0.01.0 aralığında təsadüfi bir onluq ədədi qaytarır. Math.random() metoduna çox bənzəyir. Təəccüblü bir şey yoxdur, çünki Math.random() metodu Random tipli obyektin nextDouble() metodunu çağırır.

float nextFloat() metodu

Bu metod nextDouble() metoduna çox bənzəyir, amma qaytarılan təsadüfi ədəd float tipindədir. O da 0.01.0 aralığında olur. Java-da həmişə olduğu kimi bu aralığa 1.0 daxil deyil.

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

int nextInt(int max) metodu

Bu metod təsadüfi tam ədəd qaytarır [0, max) aralığında. 0 aralığa daxildir, max daxil deyil.

Məsələn, siz 1, 2, 3, 4, 5, 6 dəstindən təsadüfi bir ədəd əldə etmək istəyirsinizsə, alınan təsadüfi ədədə bir vahid əlavə etməlisiniz:

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

int nextInt() metodu

Bu metod əvvəlkindən fərqli olaraq heç bir parametr qəbul etmir. Belə isə hansı aralıqda ədədlər verir? -2 milyard-dan +2 milyard-a qədər.

Yəni dəqiq desək, -2147483648-dən +2147483647-ə qədər.

long nextLong() metodu

Bu metod nextInt() metoduna bənzəyir, amma qaytarılan dəyər long tipinin bütün mümkün dəyərlər aralığından olacaq.

boolean nextBoolean() metodu

Bu metod təsadüfi boolean tipində bir dəyər qaytarır: false və ya true. Uzun bir təsadüfi məntiqi dəyərlər sırası lazım olduqda çox əlverişlidir.

void nextBytes(byte[] data) metodu

Bu metod heç bir şey qaytarmır (void tipi). Bunun əvəzinə ona ötürülmüş massivi təsadüfi dəyərlərlə doldurur. Böyük təsadüfi məlumatlarla dolu bir tampon lazım olduqda çox rahatdır.

double nextGaussian() metodu

Bu metod 0.01.0 aralığında təsadüfi onluq ədəd qaytarır. Yalnız bu aralıqdakı ədədlər bərabər paylanmır, onlar normal paylanmaya tabedir.

Aralığın mərkəzinə (0.5) yaxın ədədlər daha tez-tez çıxacaq, aralığın kənarındakı dəyərlərdən daha çox.

Random sinfi

Böyük dəyərlər bizim vəziyyətimizdə 0.5-də yerləşəcək.



Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION