JavaRush /Блоги Java /Random-TG /Назарияи эҳтимолият дар амал ё шумо дар бораи Random медо...
Viacheslav
Сатҳи

Назарияи эҳтимолият дар амал ё шумо дар бораи Random медонед

Дар гурӯҳ нашр шудааст
Назарияи эҳтимолият дар амал ё шумо дар бораи Random медонед - 1

Муқаддима

Дар ҷаҳон илмҳои зиёде мавҷуданд, ки назарияи эҳтимолиятро меомӯзанд. Ва илмҳо аз бахшҳои мухталиф иборатанд. Масалан, дар математика бахши алохида мавчуд аст, ки ба омузиши ходисахои тасодуфй, микдорхо ва гайра бахшида шудааст. Аммо илмро сабукфикрона кабул намекунанд. Дар ин ҳолат, назарияи эҳтимолият вақте шакл гирифт, ки одамон кӯшиш мекарданд, ки фаҳманд, ки ҳангоми бозӣ кардани бозиҳои тасодуфӣ чӣ гуна намунаҳо дар партови зар вуҷуд доранд. Агар шумо бодиққат назар кунед, дар атрофи мо чизҳои ба назар тасодуфӣ зиёданд. Аммо ҳама чизи тасодуфӣ комилан тасодуфӣ нест. Аммо дар ин бора баъдтар. Забони барномасозии Java инчунин рақамҳои тасодуфиро дастгирӣ мекунад, ки аз versionи якуми JDK оғоз мешавад. Рақамҳои тасодуфӣ дар Java метавонанд бо истифода аз синфи java.util.Random истифода шаванд . Барои санҷиш, мо compiler онлайн tutorialspoint java -ро истифода мебарем . Ин аст як мисоли ибтидоии истифодаи Random барои тақлид кардан ба партофтани "зар" ё мукааб ба забони русӣ:
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);
    }
}
Чунин ба назар мерасад, ки ин метавонад охири тавсифи Random бошад , аммо ин он қадар оддӣ нест. Биёед тавсифи синфи java.util.Randomро дар Java API кушоем. Ва дар ин ҷо мо чизҳои ҷолибро мебинем. Синфи Random рақамҳои псевдо-тасодуфӣ истифода мебарад. Чӣ тавр? Маълум мешавад, ки рақамҳои тасодуфӣ он қадар тасодуфӣ нестанд?
Теория вероятностей на практике or знаете ли вы о Random - 2

Псевдо-тасодуфӣ java.util.Random

Ҳуҷҷатҳои синфи java.util.Random мегӯяд, ки агар мисолҳои Random бо як параметри тухмӣ сохта шаванд ва пайдарпайии якхелаи амалҳо дар мисолҳо иҷро карда шаванд, онҳо пайдарпайии рақамҳои якхеларо бармегардонанд. Ва агар бодиққат нигоҳ кунем, мо мебинем, ки Random воқеан як конструктор дорад, ки ҳамчун тухм арзиши дарозро мегирад :
Random rnd1 = new Random(1L);
Random rnd2 = new Random(1L);
boolean test = rnd1.nextInt(6) == rnd2.nextInt(6);
System.out.println("Test: " + test);
Ин мисол дуруст бармегардад , зеро тухми ҳарду мисол як аст. Чӣ бояд кард? Созандаи пешфарз мушкилотро қисман ҳал мекунад. Дар зер намунаи мундариҷаи созандаи Random оварда шудааст :
public Random() {
	this(seedUniquifier() ^ System.nanoTime());
}
Созандаи пешфарз амалиёти истисноии OR --ро истифода мебарад . Ва дарозро ифодакунандаи вақти ҷорӣ ва баъзе тухмиро барои ин истифода мебарад :
private static long seedUniquifier() {
	for (;;) {
		long current = seedUniquifier.get();
		long next = current * 181783497276652981L;
		if (seedUniquifier.compareAndSet(current, next))
			return next;
	}
}
Боз як чизи ҷолиб ин аст, ки ҳар як занг ба усули getter seedUniquifier арзиши seedUniquifier -ро тағир медиҳад . Яъне, синф барои интихоби рақамҳои тасодуфӣ то ҳадди имкон самаранок тарҳрезӣ шудааст. Аммо, тавре ки ҳуҷҷатҳо мегӯянд, онҳо " аз ҷиҳати криптографӣ бехатар нестанд ". Яъне барои баъзе маќсадњои истифода бо маќсадњои криптографї (тањвor парол ва ѓайра) мувофиќ нест, зеро пай дар пай бо муносибати дуруст пешгуй карда мешавад. Дар Интернет дар ин мавзӯъ мисолҳо мавҷуданд, масалан дар ин ҷо: " Пешгӯии Math.random() дар Java ». Ё масалан, рамзи сарчашма дар ин ҷо: " Заифии Crypto ". java.util.Random (генератори рақамҳои тасодуфӣ) дорои "миёнабур"-и муайяне мебошад , яъне versionи кӯтоҳшудаи занг, ки тавассути Math.random иҷро мешавад:
public static void main(String []args){
	int random_number = 1 + (int) (Math.random() * 6);
	System.out.println("Value: " + random_number);
}
Аммо агар шумо бодиққат нигоҳ кунед, ҳамон Random дар дохor он нишастааст:
public static double random() {
	return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}
private static final class RandomNumberGeneratorHolder {
	static final Random randomNumberGenerator = new Random();
}
JavaDoc тавсия медиҳад, ки синфи SecureRandom барои " генератори рақамҳои псевдо-тасодуфӣ аз ҷиҳати криптографӣ бехатар " истифода шавад.
Теория вероятностей на практике or знаете ли вы о Random - 3

Амнияти Random Java

Синфи SecureRandom зеркласси java.util.Random аст ва дар бастаи java.security ҷойгир аст . Муқоисаи ин ду синфро дар мақолаи " Тафовут байни java.util.Random ва java.security.SecureRandom " хондан мумкин аст. Чаро ин SecureRandom ин қадар хуб аст? Гап дар он аст, ки барои ӯ манбаи рақамҳои тасодуфӣ як чизи ҷодугарӣ ба мисли "ҳавзи асосии энтропия" мебошад. Ин ҳам як плюс ва ҳам минус аст. Шумо метавонед дар бораи нуқсонҳои ин дар мақола бихонед: “ Хатари java.security.SecureRandom ”. Хулоса, Linux дорои генератори рақами тасодуфии ядро ​​(RNG). RNG рақамҳои тасодуфиро дар асоси маълумот аз ҳавзи энтропия тавлид мекунад, ки дар асоси рӯйдодҳои тасодуфӣ дар система пур карда мешавад, ба монанди вақтҳои клавиатура ва диск, ҳаракатҳои муш, халалҳо ва трафики шабака. Маълумоти бештар дар бораи ҳавзи энтропия дар маводи " Рақамҳои тасодуфӣ дар Linux (RNG) ё чӣ гуна "пур кардан" /dev/random ва /dev/urandom " тавсиф шудааст. Дар системаҳои Windows, SHA1PRNG истифода мешавад, ки дар sun.security.provider.SecureRandom амалӣ карда мешавад. Бо рушди Java, SecureRandom низ тағир ёфт, ки барои дидани тасвири пурра дар барраси " Навсозиҳои Java SecureRandom аз моҳи апрели соли 2016 " хондан лозим аст.
Теория вероятностей на практике or знаете ли вы о Random - 4

Multithreading ё мисли қайсар бошед

Агар шумо ба рамзи синфи Random назар кунед , ҳеҷ чиз мушкorро нишон намедиҳад. Усулҳо ҳамоҳанг карда нашудаанд . Аммо як АММО вуҷуд дорад: ҳангоми сохтани Random бо конструктори пешфарз дар якчанд ришта, мо як тухми мисолро дар байни онҳо тақсим мекунем , ки тавассути он Random сохта мешавад . Ва инчунин вақте ки рақами нави тасодуфӣ гирифта мешавад, AtomicLong дохorи мисол низ тағир меёбад . Аз як тараф, дар ин кор аз нигоҳи мантиқӣ ҳеҷ бадӣ надорад, зеро... AtomicLong истифода мешавад . Аз тарафи дигар, шумо бояд барои ҳама чиз, аз ҷумла ҳосилнокӣ пардохт кунед. Ва барои ин низ. Аз ин рӯ, ҳатто ҳуҷҷатҳои расмии java.util.Random мегӯяд: " Намунаҳои java.util.Random риштаҳо бехатар мебошанд. Аммо, истифодаи ҳамзамон як мисоли java.util.Random дар байни риштаҳо метавонад ба ихтилофот ва ба кори пасти натиҷа дучор шавад. ба ҷои он ки ThreadLocalRandom-ро дар тарҳҳои бисёрҷабҳа истифода баред ". Яъне, дар замимаҳои бисёр ришта ҳангоми истифодаи фаъоли Random аз чанд ришта беҳтар аст, ки синфи ThreadLocalRandom истифода шавад . Истифодаи он аз Random муқаррарӣ каме фарқ мекунад :
public static void main(String []args){
	int rand = ThreadLocalRandom.current().nextInt(1,7);
	System.out.println("Value: " + rand);
}
Тавре ки шумо мебинед, мо барои он тухмиро муайян накардаем . Ин мисол дар дастури расмии Oracle тавсиф шудааст: Рақамҳои тасодуфии ҳамзамон . Шумо метавонед бештар дар бораи ин синф дар барраси хонед: " Дастур ба ThreadLocalRandom дар Java ".
Теория вероятностей на практике or знаете ли вы о Random - 5

StreamAPI ва Random

Бо баровардани Java 8, мо бисёр хусусиятҳои нав дорем. Аз ҷумла Stream API. Ва тағирот инчунин ба насли арзишҳои Random таъсир расонд . Масалан, синфи Random дорои усулҳои навест, ки ба шумо имкон медиҳад Ҷараёнро бо арзишҳои тасодуфӣ ба монанди int, doubleё long. Барои намуна:
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));
    }
}
Инчунин синфи нави 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));
    }
}
Шумо метавонед дар бораи фарқи байни SplittableRandom ва синфҳои дигар бештар дар инҷо хонед: " Роҳҳои гуногуни эҷоди рақамҳои тасодуфӣ дар Java ".

Хулоса

Ба фикрам, хулоса баровардан меарзад. Шумо бояд JavaDoc-ро барои синфҳои истифодашуда бодиққат хонед. Дар паси чизи оддӣ, ба монанди Random, нозукиҳое мавҷуданд, ки метавонанд шӯхии бераҳмона бозӣ кунанд. #Вячеслав
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION