1. angka pseudorandom

Kadhangkala programmer ngadhepi tugas sing prasaja: "milih film acak saka dhaptar tartamtu", "milih pemenang lotre", "ngacak dhaptar lagu nalika pangguna goyangake smartphone", "milih nomer acak kanggo ndhelik pesen" , etc Ing saben kasus, pangembang takon pitakonan logis: carane njaluk nomer acak?

Bener, entuk nomer acak kanthi bener rada angel ditindakake. Ing kasunyatan, iku dadi angel sing coprocessors matematika khusus dibangun ing sawetara komputer kanggo generate nomer sing gawe marem kabeh syarat kanggo randomness bener.

Programer teka karo solusi dhewe: nomer pseudorandom . Nomer pseudorandom minangka jinis urutan, sing nomer kasebut katon acak. Nanging, kanthi nindakake analisis sing ati-ati, pakar bisa nemokake pola tartamtu ing urutan kasebut. nomer kuwi ora cocok kanggo ndhelik dokumen rahasia, nanging padha cukup kanggo simulating muter mati ing game.

Ana akeh algoritma kanggo ngasilake urutan nomer pseudorandom. Meh kabeh padha generate nomer acak sabanjuré adhedhasar nomer sadurungé lan sawetara nomer helper tambahan.

Contone, program iki bakal nampilake 1000nomer sing ora diulang:

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

Miturut cara, kita ora ngomong babagan nomer pseudorandom ing kene. Kita ngomong babagan urutan nomer pseudorandom. Nggoleki nomer siji, iku mokal kanggo ngomong apa iku acak utawa ora.

Pancen, ana macem-macem cara kanggo entuk nomer acak:

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

2.Math.random()

Ing Jawa, Mathkelas nduweni cara khusus sing ngasilake nomer acak. Lan kaya sing sampeyan duga, metode kasebut diarani random. Umumé, kaya sing diarani metode iki:

Math.random()

Cara iki ora njupuk paramèter lan ngasilake nomer nyata pseudorandom ing sawetara saka 0kanggo 1. Nomer 1 dhewe ora kalebu ing sawetara.

Tuladha:

Kode Output konsol
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

Nanging kepiye yen cara iki ora cocog karo sing sampeyan butuhake? Upaminipun, sampeyan pengin nulis program sing simulates muter mati enem-sisi. Carane njaluk ongko acak ing sawetara 1..6, tinimbang nomer nyata ing sawetara 0..1?

Iku bener cukup prasaja.

Pisanan, sampeyan kudu ngepetake kisaran [0, 1)menyang [0, 6). Kanggo nindakake iki, mung multiply asil bali random()dening 6. Mesthi, kanggo entuk integer, sampeyan kudu nglumpukake:

Kode Output konsol
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

Ing getRandomDieNumber()ngasilake integer acak ing sawetara 0..5kalebu. Nanging ora bakal dadi nomer ing set 1, 2, 3, 4, 5, 6. Iku bakal dadi nomer ing set 0, 1, 2, 3, 4, 5.

Yen sing sampeyan butuhake yaiku nomer ing set 1, 2, 3, 4, 5, 6, tambahake siji menyang nomer acak:

Kode Output konsol
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

Saiki sing sampurna!



3. Randomkelas

Jawa nduweni Randomkelas khusus sing nyakup urutan nomer pseudorandom. Sampeyan bisa nggawe sawetara obyek saka Randomkelas. Saben obyek kasebut bakal ngasilake urutan nomer pseudorandom dhewe.

Iki minangka kelas sing menarik banget kanthi akeh metode sing menarik. Ayo dadi miwiti karo paling prasaja.

double nextDouble()

Cara iki ngasilake nomer nyata acak ing sawetara 0.0- 1.0. Iku banget padha karo Math.random()cara. Lan ora nggumunake, amarga Math.random()metode kasebut mung nelpon nextDouble()metode ing Randomobyek.

float nextFloat()

Cara iki meh padha karo nextDouble()cara, nanging nomer acak bali a float. Iku uga dumunung ing sawetara 0.0- 1.0. Lan, kaya biasane ing Jawa, sawetara ora kalebu nomer kasebut 1.0dhewe.

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

int nextInt(int max)

Cara iki ngasilake integer acak ing kisaran [0, max). 0kalebu ing sawetara, nanging maxora.

Ing tembung liyane, yen sampeyan pengin njaluk nomer acak ing pesawat 1, 2, 3, 4, 5, 6, sampeyan kudu nambah siji menyang nomer acak bali:

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

int nextInt()

Cara iki padha karo sing sadurunge, nanging ora njupuk paramèter. Dadi apa kisaran kanggo nilai bali? Saka -2 billionkanggo +2 billion.

Inggih, dadi tepat, saka -2147483648kanggo +2147483647.

long nextLong()

Cara iki padha karo nextInt()cara, nanging Nilai bali bakal tiba nang endi wae ing kabeh sawetara bisa longs.

boolean nextBoolean()

Cara iki ngasilake booleannilai acak: falseutawa true. Iki trep banget yen sampeyan kudu njaluk urutan dawa saka nilai boolean acak.

void nextBytes(byte[] data)

Cara iki ora ngasilake apa-apa (amarga jinis bali yaiku void). Nanging, ngisi array sing dilewati kanthi nilai acak. Iki gampang banget nalika sampeyan butuh buffer gedhe sing diisi data acak.

double nextGaussian()

Cara iki ngasilake nomer nyata acak ing sawetara 0.0- 1.0. Nanging, nomer kasebut ora disebarake kanthi rata ing kisaran iki. Nanging, padha ngetutake distribusi normal .

Nilai sing cedhak karo tengah kisaran ( 0.5) bakal luwih kerep kedaden tinimbang nilai ing ujung kisaran.

Kelas acak

Ing kasus kita, puncak distribusi nilai bakal ing0.5