JavaRush /Blog Jawa /Random-JV /Teori probabilitas ing praktik utawa sampeyan ngerti baba...
Viacheslav
tingkat

Teori probabilitas ing praktik utawa sampeyan ngerti babagan Random

Diterbitake ing grup
Teori probabilitas ing praktik utawa sampeyan ngerti babagan Random - 1

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?
Teori probabilitas ing praktik utawa sampeyan ngerti babagan Random - 2

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 ".
Teori probabilitas ing praktik utawa sampeyan ngerti babagan Random - 3

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.
Teori probabilitas ing praktik utawa sampeyan ngerti babagan Random - 4

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 ".
Teori probabilitas ing praktik utawa sampeyan ngerti babagan Random - 5

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, doubleutawa 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
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION