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 1000
nomer 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, Math
kelas 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 0
kanggo 1
. Nomer 1 dhewe ora kalebu ing sawetara.
Tuladha:
Kode | Output konsol |
---|---|
|
|
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 |
---|---|
|
|
Ing getRandomDieNumber()
ngasilake integer acak ing sawetara 0..5
kalebu. 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 |
---|---|
|
|
Saiki sing sampurna!
3. Random
kelas
Jawa nduweni Random
kelas khusus sing nyakup urutan nomer pseudorandom. Sampeyan bisa nggawe sawetara obyek saka Random
kelas. 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 Random
obyek.
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.0
dhewe.
Random r = new Random();
float f = r.nextFloat();
int nextInt(int max)
Cara iki ngasilake integer acak ing kisaran [0, max)
. 0
kalebu ing sawetara, nanging max
ora.
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 billion
kanggo +2 billion
.
Inggih, dadi tepat, saka -2147483648
kanggo +2147483647
.
long nextLong()
Cara iki padha karo nextInt()
cara, nanging Nilai bali bakal tiba nang endi wae ing kabeh sawetara bisa long
s.
boolean nextBoolean()
Cara iki ngasilake boolean
nilai acak: false
utawa 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.
Ing kasus kita, puncak distribusi nilai bakal ing0.5