JavaRush /Java Blog /Random-TK /Amalda ähtimallyk teoriýasy ýa-da tötänleýin bilýärsiňizm...
Viacheslav
Dereje

Amalda ähtimallyk teoriýasy ýa-da tötänleýin bilýärsiňizmi

Toparda çap edildi
Iş ýüzünde ähtimallyk teoriýasy ýa-da tötänleýin - 1 hakda bilýärsiňizmi?

Giriş

Dünýäde ähtimallyk teoriýasyny öwrenýän köp ylym bar. Ylymlar dürli bölümlerden durýar. Mysal üçin, matematikada tötänleýin hadysalary, mukdarlary we ş.m. öwrenmäge bagyşlanan aýratyn bölüm bar. Emma ylym ýönekeý hasaplanmaýar. Bu ýagdaýda, adamlar tötänleýin oýun oýnanda zar atmagyň haýsy nagyşlarynyň bardygyna düşünjek bolanda ähtimallyk teoriýasy kemala gelip başlady. Closelyakyndan göz aýlasaň, töweregimizde tötänleýin ýaly görünýän köp zat bar. Emma tötänleýin hemme zat tötänleýin däl. Emma soňrak. Java programmirleme dili, JDK-nyň birinji wersiýasyndan başlap, tötänleýin sanlary hem goldaýar. Java-da tötänleýin sanlar java.util.Random synpyny ulanyp bolýar . Synag üçin, tutorialspoint java onlaýn düzüjisini ulanarys . Ine , “zar” ýa-da rus dilinde kublary zyňmak üçin “ Random” -dan peýdalanmagyň ilkinji mysaly :
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);
    }
}
Munuň tötänleýin beýanynyň soňy bolup biljege meňzeýär , ýöne beýle ýönekeý däl. Java API-de java.util.Random synpynyň düşündirişini açalyň . Bu ýerde gyzykly zatlary görýäris. Tötänleýin synpda pseudo-tötänleýin sanlar ulanylýar. Nädip? Görnüşi ýaly, tötänleýin sanlar beýle bir tötänleýin dälmi?
Iş ýüzünde ähtimallyk teoriýasy ýa-da tötänleýin - 2 hakda bilýärsiňizmi?

Pseudo-tötänlik java.util.Random

Java.util . _ _ _ _ _ Closelyakyndan göz aýlasak, “Random” -yň tohum hökmünde uzak bahany alýan konstruktorynyň bardygyny görüp bileris:
Random rnd1 = new Random(1L);
Random rnd2 = new Random(1L);
boolean test = rnd1.nextInt(6) == rnd2.nextInt(6);
System.out.println("Test: " + test);
Bu mysal hakykata gaýdyp geler, sebäbi iki hadysanyň tohumy birmeňzeşdir. Näme etmeli? Adaty konstruktor meseläni bölekleýin çözýär. Aşakda tötänleýin konstruktoryň mazmuny görkezilýär :
public Random() {
	this(seedUniquifier() ^ System.nanoTime());
}
Deslapky konstruktor bitwise eksklýuziw ýa-da amaly ulanýar . Munuň üçin häzirki wagty we käbir tohumlary görkezýän uzyn ulanýar :
private static long seedUniquifier() {
	for (;;) {
		long current = seedUniquifier.get();
		long next = current * 181783497276652981L;
		if (seedUniquifier.compareAndSet(current, next))
			return next;
	}
}
Bu ýerde ýene bir gyzykly zat, tohumUniquifier getter usulyna edilen her bir jaň, tohumUniquifier-iň bahasyny üýtgedýär . .Agny, synp tötänleýin sanlary mümkin boldugyça has netijeli saýlamak üçin döredildi. Şeýle-de bolsa, resminamalarda aýdylyşy ýaly, olar " kriptografiki taýdan howpsuz däl ". Cryagny, kriptografiki maksatlar (parol döretmek we ş.m.) üçin käbir maksatlar üçin ýerlikli däl, sebäbi dogry çemeleşmegiň yzygiderliligi çak edilýär. Internetde bu mowzukda mysallar bar, mysal üçin şu ýerde: " Java-da indiki Math.random () çaklamak ". Ora-da mysal üçin bu ýerdäki deslapky kody: " Gowşaklyk gowşak kripto ". java.util.Random (tötänleýin san generatorynyň) belli bir “gysga ýoly” bar , ýagny Math.random arkaly ýerine ýetirilýän jaňyň gysgaldylan görnüşi:
public static void main(String []args){
	int random_number = 1 + (int) (Math.random() * 6);
	System.out.println("Value: " + random_number);
}
Carefullyöne seresaplylyk bilen seretseňiz, şol bir tötänleýin içerde oturýar:
public static double random() {
	return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}
private static final class RandomNumberGeneratorHolder {
	static final Random randomNumberGenerator = new Random();
}
JavaDoc, “ kriptografiki taýdan ygtybarly pseudo-tötänleýin san generatory ” üçin SecureRandom synpyny ulanmagy maslahat berýär .
Iş ýüzünde ähtimallyk teoriýasy ýa-da tötänleýin - 3 hakda bilýärsiňizmi?

Howpsuz tötänleýin Java

“SecureRandom” synpy java.util.Random- iň kiçi synpy bolup , java.security bukjasynda ýerleşýär . Bu iki synpyň deňeşdirmesini " java.util.Random bilen java.security.SecureRandom arasyndaky tapawut " makalasynda okap bilersiňiz . Näme üçin bu SecureRandom beýle gowy? Hakykat, tötänleýin sanlaryň çeşmesi “esasy entropiýa howuzy” ýaly jadyly bir zat. Bu hem goşmaça, hem minus. Munuň kemçilikleri barada " java.security.SecureRandom" howpy barada makalada okap bilersiňiz . Gysgaça aýdylanda, Linux-da ýadro tötänleýin san generatory (RNG) bar. RNG, ulgamdaky klawiatura we disk wagtlary, syçanjygyň hereketleri, bökdençlikler we tor trafigi ýaly tötänleýin hadysalara esaslanan entropiýa basseýnindäki maglumatlara esaslanýan tötänleýin sanlary döredýär. Entropiýa howzy barada has giňişleýin maglumat " Linux-da tötänleýin sanlar (RNG)" ýa-da "doldurmak" / dev / tötänleýin we / dev / urandom " materiallarynda beýan edilýär . Windows ulgamlarynda SHA1PRNG ulanylýar, sun.security.provider.SecureRandom. Java-yň ösmegi bilen, SecureRandom hem üýtgedi, doly surat üçin “ 2016-njy ýylyň aprel aýyna çenli Java SecureRandom täzelenmeleri ” synynda okamaly .
Iş ýüzünde ähtimallyk teoriýasy ýa-da tötänleýin - 4 hakda bilýärsiňizmi?

Köp okamak ýa-da Sezar ýaly bolmak

Tötänleýin synpyň koduna seretseň , hiç zat kynçylyk görkezmeýän ýaly. Usullar sinhronlaşdyrylan däl . Oneöne bir UTöne bar: birnäçe sapakda deslapky konstruktor bilen tötänleýin döredilende , tötänleýin dörediljek şol bir tohum tohumyny paýlaşarys . Şeýle hem, täze tötänleýin san alnanda, içerki AtomicLong hem üýtgeýär . Bir tarapdan, logiki nukdaýnazardan bu ýerde hiç hili ýalňyşlyk ýok, sebäbi ... AtomicLong ulanylýar . Başga bir tarapdan, öndürijilik bilen birlikde hemme zat üçin pul tölemeli. Munuň üçin hem. Şol sebäpden, hatda java.util.Random üçin resmi resminamalarda şeýle diýilýär: " java.util.Random mysallary sapaklydyr. Şeýle-de bolsa, şol bir java.util. Tötänleýin sapaklaryň arasynda ulanylmagy gapma-garşylyga we netijede pes öndürijilige sebäp bolup biler. ýerine köp okalýan dizaýnlarda “ThreadLocalRandom” -y ulanmak ". .Agny, birnäçe sapakdan “Random” -y işjeň ulananyňyzda köp sapakly programmalarda “ThreadLocalRandom” synpyny ulanmak has gowudyr . Ulanylyşy adaty tötänleýin birneme tapawutlanýar :
public static void main(String []args){
	int rand = ThreadLocalRandom.current().nextInt(1,7);
	System.out.println("Value: " + rand);
}
Görşüňiz ýaly, biz onuň üçin tohum görkezmeýäris . Bu mysal “Oracle: Concurrent Random Numbers” -iň resmi sapagynda beýan edilýär . Bu synp hakda has giňişleýin maglumaty gözden geçirip bilersiňiz: " Java-da ThreadLocalRandom üçin gollanma ".
Amalda ähtimallyk teoriýasy ýa-da tötänleýin - 5 hakda bilýärsiňizmi?

StreamAPI we tötänleýin

Java 8-iň çykmagy bilen bizde köp täze aýratynlyklar bar. Şol sanda Stream API. Üýtgeşmeler tötänleýin gymmatlyklaryň döremegine-de täsir etdi. Mysal üçin, Tötänleýin synpda , ýa-da ýaly tötänleýin bahalar bilen Akym almaga mümkinçilik berýän täze usullar bar . Mysal üçin: intdoublelong
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));
    }
}
Şeýle hem “SplittableRandom” atly täze synp bar :
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));
    }
}
“SplittableRandom” bilen beýleki synplaryň arasyndaky tapawut barada has giňişleýin maglumaty şu ýerden okap bilersiňiz: " Java-da tötänleýin sanlary döretmegiň dürli ýollary ".

Netije

Netije çykarmaly diýip pikir edýärin. Ulanylan sapaklar üçin JavaDoc-ny üns bilen okamaly. Bir seretseň, ýönekeý bir zadyň aňyrsynda tötänleýin ýaly zalym degişme oýnap bilýän nuanslar bar. # Wiaçeslaw
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION