JavaRush /جاوا بلاگ /Random-SD /امڪاني نظريو عملي طور تي يا ڇا توھان ڄاڻو ٿا رينڊم بابت
Viacheslav
سطح

امڪاني نظريو عملي طور تي يا ڇا توھان ڄاڻو ٿا رينڊم بابت

گروپ ۾ شايع ٿيل
امڪاني نظريو عملي طور تي يا ڇا توھان ڄاڻو ٿا رينڊم - 1

تعارف

دنيا ۾ ڪيتريون ئي سائنسون آهن جيڪي امڪان جي نظريي جو مطالعو ڪن ٿيون. ۽ سائنس مختلف حصن تي مشتمل آهي. مثال طور، رياضي ۾ هڪ الڳ سيڪشن آهي جيڪو بي ترتيب واقعن، مقدار، وغيره جي مطالعي لاء وقف آهي. پر سائنس کي روشنيءَ سان نه ورتو وڃي. انهيءَ صورت ۾، امڪان جو نظريو تڏهن شڪل اختيار ڪرڻ لڳو، جڏهن ماڻهن اهو سمجهڻ جي ڪوشش ڪئي ته ڊانس اڇلائڻ ۾ ڪهڙا نمونا هوندا هئا جڏهن موقعي جي راند کيڏندا هئا. جيڪڏهن توهان غور سان ڏسندا ته اسان جي چوڌاري ڪيتريون ئي بي ترتيب شيون نظر اچن ٿيون. پر سڀ ڪجهه بي ترتيب مڪمل طور تي بي ترتيب نه آهي. پر انهي تي وڌيڪ بعد ۾. جاوا پروگرامنگ ٻولي پڻ بي ترتيب نمبرن جي مدد ڪري ٿي، JDK جي پهرين ورزن سان شروع ٿيندي. جاوا ۾ بي ترتيب نمبر استعمال ڪري سگھجن ٿا java.util.Random ڪلاس . جاچ لاءِ، اسان استعمال ڪنداسين 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);
    }
}
اهو لڳي ٿو ته اهو رينڊم جي وضاحت جو خاتمو ٿي سگهي ٿو ، پر اهو ايترو سادو ناهي. اچو ته جاوا API ۾ java.util.Random ڪلاس جي وضاحت کي کوليون . ۽ هتي اسان کي دلچسپ شيون ڏسندا. Random طبقو pseudo-random نمبر استعمال ڪري ٿو. ائين ڪيئن؟ اهو ظاهر ٿئي ٿو ته بي ترتيب نمبر ايترو بي ترتيب نه آهن؟
امڪاني نظريو عملي طور تي يا ڇا توھان ڄاڻو ٿا رينڊم - 2 بابت

بي ترتيبي java.util.Random

java.util.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 Constructor :
public Random() {
	this(seedUniquifier() ^ System.nanoTime());
}
ڊفالٽ ڪنسٽرڪٽر استعمال ڪري ٿو bitwise exclusive OR آپريشن . ۽ استعمال ڪري ٿو ڊگھي نمائندگي ڪندڙ موجوده وقت ۽ ڪجھ ٻج ھن لاءِ :
private static long seedUniquifier() {
	for (;;) {
		long current = seedUniquifier.get();
		long next = current * 181783497276652981L;
		if (seedUniquifier.compareAndSet(current, next))
			return next;
	}
}
هتي هڪ ٻي دلچسپ ڳالهه اها آهي ته هر ڪال کي ٻج يونيڪيفائر حاصل ڪرڻ واري طريقي سان ٻج جي قيمت تبديل ڪري ٿي . اهو آهي، ڪلاس ڊزائين ڪيل بي ترتيب نمبرن کي ممڪن طور تي ممڪن طور تي چونڊيو ويو آهي. جڏهن ته، جيئن دستاويز چوي ٿو، اهي " cryptographically محفوظ نه آهن ". اھو آھي، ڪجھھ مقصدن لاء استعمال ڪرڻ لاء cryptographic مقصدن (پاسورڊ پيدا ڪرڻ، وغيره) اھو مناسب نه آھي، ڇاڪاڻ ته مناسب طريقي سان ترتيب جي اڳڪٿي ڪئي وئي آهي. انٽرنيٽ تي هن موضوع تي مثال موجود آهن، مثال طور هتي: " اڳڪٿي ڪرڻ ايندڙ Math.random() جاوا ۾ ". يا مثال طور هتي جو سورس ڪوڊ: " Vulnerability Weak Crypto ". java.util.Random (بي ترتيب نمبر جنريٽر) وٽ هڪ خاص ”شارٽ ڪٽ“ هوندو آهي، يعني ڪال جو هڪ مختصر نسخو جيڪو Math.random ذريعي ڪيو ويندو آهي:
public static void main(String []args){
	int random_number = 1 + (int) (Math.random() * 6);
	System.out.println("Value: " + random_number);
}
پر جيڪڏهن توهان غور سان ڏسندا ته، ساڳيو رينڊم اندر ويٺو آهي:
public static double random() {
	return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}
private static final class RandomNumberGeneratorHolder {
	static final Random randomNumberGenerator = new Random();
}
JavaDoc " cryptographically safe pseudo-random number جنريٽر " لاءِ SecureRandom ڪلاس استعمال ڪرڻ جي صلاح ڏئي ٿو .
امڪاني نظريو عملي طور تي يا ڇا توھان ڄاڻو ٿا رينڊم - 3 بابت

محفوظ رينڊم جاوا

SecureRandom ڪلاس java.util.Random جو ھڪڙو ذيلي ڪلاس آھي ۽ java.security پيڪيج ۾ واقع آھي . انهن ٻن طبقن جو هڪ مقابلو مضمون ۾ پڙهي سگهجي ٿو " java.util.Random ۽ java.security.SecureRandom جي وچ ۾ فرق ". هي SecureRandom ايترو سٺو ڇو آهي؟ حقيقت اها آهي ته هن لاءِ بي ترتيب انگن جو ذريعو هڪ اهڙي جادوئي آواز واري شيءِ آهي جيئن ”ڪور اينٽراپي پول“. هي ٻئي هڪ پلس ۽ هڪ مائنس آهي. توھان ھن مضمون ۾ ھن جي نقصانن بابت پڙھي سگھو ٿا: " جاوا. سيڪيورٽي. سيڪيورٽي رينڊم جا خطرا ". مختصر ۾، لينڪس وٽ هڪ ڪنيل بي ترتيب نمبر جنريٽر (RNG) آهي. RNG اينٽراپي پول مان ڊيٽا جي بنياد تي بي ترتيب نمبر ٺاهي ٿو، جيڪو سسٽم ۾ بي ترتيب واقعن جي بنياد تي ڀريو ويو آهي، جهڙوڪ ڪيبورڊ ۽ ڊسڪ ٽائيم، مائوس جي حرڪت، مداخلت، ۽ نيٽورڪ ٽرئفڪ. اينٽراپي پول بابت وڌيڪ معلومات مواد ۾ بيان ڪئي وئي آهي " لينڪس ۾ بي ترتيب نمبر (RNG) يا ڪيئن "fill" /dev/random ۽ /dev/urandom ". ونڊوز سسٽم تي، SHA1PRNG استعمال ڪيو ويندو آهي، sun.security.provider.SecureRandom ۾ لاڳو ڪيو ويندو آهي. جاوا جي ترقي سان، SecureRandom پڻ تبديل ٿي وئي، جيڪا مڪمل تصوير لاء " جاوا سيڪيور رينڊم اپڊيٽس اپريل 2016" جي نظرثاني ۾ پڙهڻ جي قابل آهي .
امڪاني نظريو عملي طور تي يا ڇا توھان ڄاڻو ٿا رينڊم - 4 بابت

گهڻ رخي يا قيصر وانگر ٿيڻ

جيڪڏهن توهان نظر اچن ٿا رينڊم ڪلاس جو ڪوڊ ، ڪجھ به نه لڳي ته مصيبت ظاهر ٿئي. طريقن کي هم وقت نشان نه لڳايو ويو آهي . پر هتي هڪ آهي BUT: جڏهن ڪيترن ئي موضوعن ۾ ڊفالٽ ڪنسٽرڪٽر سان Random ٺاهي، اسان انهن جي وچ ۾ ساڳيو مثال سيڊ شيئر ڪنداسين ، جنهن سان Random ٺاهي ويندي . ۽ اهو پڻ جڏهن هڪ نئون بي ترتيب نمبر ملي ٿو، مثال جي اندروني ائٽمي لانگ پڻ تبديل ڪري ٿي . هڪ پاسي، منطقي نقطي نظر کان هن ۾ ڪجھ به غلط ناهي، ڇاڪاڻ ته ... AtomicLong استعمال ڪيو ويندو آهي . ٻئي طرف، توهان کي هر شيء لاء ادا ڪرڻو پوندو، پيداوار سميت. ۽ هن لاء پڻ. تنهن ڪري، java.util.Random لاءِ سرڪاري دستاويز به چوي ٿو: " جاوا.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 جي سرڪاري ٽيوٽوريل ۾ بيان ڪيو ويو آهي: Concurrent Random Numbers . توھان ھن ڪلاس بابت وڌيڪ پڙھي سگھوٿا جائزو ۾: " جاوا ۾ ThreadLocalRandom جي ھدايت ".
امڪاني نظريو عملي طور تي يا ڇا توھان ڄاڻو ٿا رينڊم - 5 بابت

StreamAPI ۽ بي ترتيب

جاوا 8 جي ڇڏڻ سان، اسان وٽ ڪيترائي نوان خاصيتون آهن. اسٽريم API سميت. ۽ تبديلين پڻ بي ترتيب قدرن جي نسل کي متاثر ڪيو. مثال طور، رينڊم ڪلاس ۾ نوان طريقا آهن جيڪي توهان کي بي ترتيب قدرن سان هڪ وهڪرو حاصل ڪرڻ جي اجازت ڏين ٿا جهڙوڪ 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 ۽ ٻين طبقن جي وچ ۾ فرق بابت وڌيڪ هتي پڙهي سگهو ٿا: " جاوا ۾ بي ترتيب نمبر ٺاهڻ جا مختلف طريقا ".

نتيجو

مان سمجهان ٿو ته اهو هڪ نتيجو ڪڍڻ جي قابل آهي. توھان کي احتياط سان پڙھڻ جي ضرورت آھي JavaDoc استعمال ٿيل ڪلاسن لاءِ. ڪنهن شيءِ جي پويان جيئن ته پهرين نظر ۾ سادو آهي جيئن بي ترتيب اتي اهڙا نزاڪت آهن جيڪي ظالمانه مذاق کيڏي سگهن ٿيون. #وياچسلاو
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION