Pambuka
Ana akeh ilmu ing donya sing nyinaoni teori probabilitas. Lan ilmu kalebu macem-macem bagean. Contone, ing matématika ana bagean kapisah khusus kanggo sinau acara acak, jumlah, etc. Nanging ilmu ora dianggep entheng. Ing kasus iki, teori kemungkinan wiwit njupuk wangun nalika wong nyoba kanggo mangerteni apa pola ana ing uncalan dadu nalika muter game saka kasempatan. Yen sampeyan ndeleng kanthi teliti, ana akeh perkara sing katon acak ing saubengé. Nanging kabeh acak ora rampung acak. Nanging luwih ing mengko. Basa pemrograman Java uga nduweni dhukungan kanggo nomer acak, diwiwiti saka versi pisanan saka JDK. Nomer acak ing Jawa bisa digunakake nggunakake kelas
java.util.Random . Kanggo testing, kita bakal nggunakake
tutorialspoint java compiler online . Iki minangka conto primitif nggunakake
Random kanggo niru "dadu", utawa kubus ing basa Rusia:
import java.util.Random;
public class HelloWorld{
public static void main(String []args){
Random rnd = new Random();
int number = rnd.nextInt(6) + 1;
System.out.println("Random number: " + number);
}
}
Iku bakal koyone sing iki bisa dadi mburi gambaran saka
Random , nanging ora sing prasaja. Ayo mbukak katrangan kelas
java.util.Random ing Java API. Lan ing kene kita ndeleng perkara sing menarik. Kelas
Random nggunakake nomer pseudo-random. Kepiye carane? Pranyata metu sing nomer acak ora supaya acak?
Pseudo-randomness java.util.Random
Dokumentasi kanggo kelas
java.util.Random ngandika yen kedadean
saka Random digawe karo parameter
winih padha lan urutan tumindak padha dileksanakake ing kedadean, padha bali urutan podho rupo saka nomer. Lan yen kita ndeleng kanthi rapet, kita bisa ndeleng manawa
Random pancen duwe
konstruktor sing njupuk sawetara nilai
dawa minangka
wiji:
Random rnd1 = new Random(1L);
Random rnd2 = new Random(1L);
boolean test = rnd1.nextInt(6) == rnd2.nextInt(6);
System.out.println("Test: " + test);
Conto iki bakal bali
bener amarga
wiji saka loro kedadean iku padha. Apa sing kudu ditindakake? Konstruktor standar sebagian ngatasi masalah kasebut. Ing ngisor iki minangka conto isi konstruktor
Acak :
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
Konstruktor standar nggunakake operasi
UTAWA eksklusif bitwise . Lan iki nggunakake
dawa makili wektu saiki lan sawetara
wiji :
private static long seedUniquifier() {
for (;;) {
long current = seedUniquifier.get();
long next = current * 181783497276652981L;
if (seedUniquifier.compareAndSet(current, next))
return next;
}
}
Bab liyane sing menarik yaiku saben telpon menyang metode getter
seedUniquifier ngganti nilai
seedUniquifier . Sing, kelas dirancang kanggo milih nomer acak minangka irit sabisa. Nanging, minangka dokumentasi ngandika, padha "
ora cryptographically aman ". Yaiku, kanggo sawetara tujuan panggunaan kanggo tujuan kriptografi (generasi sandhi, lan liya-liyane) ora cocog, amarga urutan kanthi pendekatan sing tepat diprediksi. Ana conto topik iki ing Internet, contone ing kene: "
Prediksi Math.random sabanjure () ing Jawa ". Utawa contone kode sumber ing kene: "
Vulnerability Weak Crypto ". java.util.Random (generator nomer acak) duwe "trabasan" tartamtu, yaiku
, versi singkat saka panggilan sing dieksekusi liwat Math.random:
public static void main(String []args){
int random_number = 1 + (int) (Math.random() * 6);
System.out.println("Value: " + random_number);
}
Nanging yen sampeyan ndeleng kanthi teliti, padha Random lenggah nang:
public static double random() {
return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}
private static final class RandomNumberGeneratorHolder {
static final Random randomNumberGenerator = new Random();
}
JavaDoc menehi saran nggunakake kelas
SecureRandom kanggo "
generator nomer pseudo-acak kanthi cryptographically ".
Aman Acak Jawa
Kelas
SecureRandom iku subclass saka
java.util.Random lan dumunung ing paket
java.security . A comparison saka rong kelas iki bisa maca ing artikel "
Bedane antarane java.util.Random lan java.security.SecureRandom ". Napa SecureRandom iki apik banget? Kasunyatane, kanggo dheweke, sumber nomer acak kasebut minangka "kolam entropi inti". Iki minangka plus lan minus. Sampeyan bisa maca babagan kekurangan iki ing artikel: "
Bebaya java.security.SecureRandom ". Singkatipun, Linux nduweni generator nomer acak kernel (RNG). RNG ngasilake nomer acak adhedhasar data saka blumbang entropi, sing diisi adhedhasar acara acak ing sistem, kayata keyboard lan wektu disk, gerakan mouse, interrupts, lan lalu lintas jaringan. Informasi liyane babagan blumbang entropi diterangake ing materi "
Nomer acak ing Linux (RNG) utawa carane "isi" / dev / acak lan / dev / urandom ". Ing sistem Windows, SHA1PRNG digunakake, dileksanakake ing sun.security.provider.SecureRandom. Kanthi pangembangan Java, SecureRandom uga diganti, sing kudu diwaca ing review "
Pembaruan Java SecureRandom wiwit April 2016 " kanggo gambar lengkap.
Multithreading utawa kaya Caesar
Yen sampeyan ndeleng kode kelas
Random , ora ana sing nuduhake masalah. Cara ora ditandhani
disinkronake . Nanging ana siji TAPI: nalika nggawe
Random karo konstruktor standar ing sawetara Utas, kita bakal nuduhake
winih Kayata padha antarane wong-wong mau , kang
Random bakal digawe . Lan uga nalika nomer acak anyar ditampa,
AtomicLong internal Kayata uga ngganti . Ing tangan siji, ora ana sing salah karo iki saka sudut pandang logis, amarga ...
AtomicLong digunakake . Ing sisih liya, sampeyan kudu mbayar kabeh, kalebu produktivitas. Lan kanggo iki uga. Mulane, malah dokumentasi resmi kanggo
java.util.Random ngandika: "
Instance java.util.Random are threadsafe. tinimbang nggunakake ThreadLocalRandom ing desain multithreaded ". Sing, ing aplikasi multi-Utas nalika aktif nggunakake
Random saka sawetara Utas, iku luwih apik kanggo nggunakake kelas
ThreadLocalRandom . Panganggone rada beda karo
Random biasa :
public static void main(String []args){
int rand = ThreadLocalRandom.current().nextInt(1,7);
System.out.println("Value: " + rand);
}
Kaya sing sampeyan ngerteni, kita ora nemtokake
wiji kasebut . Conto iki diterangake ing tutorial resmi saka Oracle:
Concurrent Random Numbers . Sampeyan bisa maca liyane babagan kelas iki ing review: "
Guide to ThreadLocalRandom in Java ".
StreamAPI lan Random
Kanthi rilis Java 8, kita duwe akeh fitur anyar. Kalebu Stream API. Lan owah-owahan uga mengaruhi generasi Nilai
Random . Contone, kelas
Random duwe cara anyar sing ngidini sampeyan entuk
Stream kanthi nilai acak kaya
int
,
double
utawa
long
. Tuladhane:
import java.util.Random;
public class HelloWorld{
public static void main(String []args){
new Random().ints(10, 1, 7).forEach(n -> System.out.println(n));
}
}
Ana uga kelas anyar
SplittableRandom :
import java.util.SplittableRandom;
public class HelloWorld{
public static void main(String []args){
new SplittableRandom().ints(10, 1, 7).forEach(n -> System.out.println(n));
}
}
Sampeyan bisa maca liyane babagan prabédan antarane
SplittableRandom lan kelas liyane kene: "
Beda cara kanggo nggawe nomer Random ing Jawa ".
Kesimpulan
Aku iku worth tarik kesimpulan. Sampeyan kudu kasebut kanthi teliti maca JavaDoc kanggo kelas digunakake. Konco soko minangka prasaja ing kawitan marketing minangka Random ana nuansa sing bisa muter guyon kejem. #Viacheslav
GO TO FULL VERSION