
Azaldan ko’pchilik tavakkalikka asoslangan o’yinlarda qatnashib birdaniga hayoti yaxshi bo’lib ketishini xohlaydi. Avvallari ko’pchilik lotoreya o’ynar edi, hozirda bunday o’yinlar o’rnini onlayn kazinolar egallagan. Deyarli ko’plab shu kabi o’yinlarda kompyuter random tarzda ishtirokchilarga aloqador sonlardan birini tanlaydi va omadi kulgan millionerga aylanadi. Bu huddi tabiiydek. Aslida ham shundaymikan. Keling random qanday ishlashi ko’rib chiqamiz
Random
Kompyuterlardagi random aslida PRNG (Pseudo-Random Number Generator — Soxta tasodifiy sonlar generatori) deyiladi.
Tabiatdagi esa TRNG (True Random Number Generator).
Biz avval PRNG qanday ishlashi ko’rib chiqganimizdan so’ng TRNG ishlashini ko’rib chiqamiz.
Bizda kompyuterda PRNG yaratish uchun quyidagi java fayli (runnable classi) mavjud:
package random;
import eunums.Gender;
import model.Person;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
public class Example {
static void main() {
List<Person> people = List.of(
new Person(1, "Javlon", "Ergashev", 27, Gender.MALE),
new Person(2, "Javohir", "Ergashev", 28, Gender.MALE),
new Person(3, "Jamshid", "Ergashev", 29, Gender.MALE),
new Person(4, "Jasur", "Ergashev", 30, Gender.MALE),
new Person(5, "Oysha", "Olimova", 30, Gender.FEMALE)
);
Map<Integer, Integer> counter = new HashMap<>(5);
for (Person person : people) {
counter.put(person.getId(), 0);
}
Random random = new Random();
for (int i = 0; i < 100_000; i++) {
int randomNum = random.nextInt(people.size());
Person chosenPerson = people.get(randomNum);
counter.put(chosenPerson.getId(), counter.get(chosenPerson.getId()) + 1);
}
for (Person person : people) {
int count = counter.get(person.getId());
double percentage = ((double) count / 100_000) * 100;
System.out.printf("%s: %d marta chiqdi (Ehtimollik: %.2f%%)%n",
person.getFirstName(), count, percentage);
}
}
}
Example.java
Natija:
Javlon: 20185 marta chiqdi (Ehtimollik: 20,19%)
Javohir: 19989 marta chiqdi (Ehtimollik: 19,99%)
Jamshid: 19772 marta chiqdi (Ehtimollik: 19,77%)
Jasur: 19998 marta chiqdi (Ehtimollik: 20,00%)
Oysha: 20056 marta chiqdi (Ehtimollik: 20,06%)
Process finished with exit code 0bash
Bu yerda ko’rimiz mumkinki deyarli barchasi ~20 % atrofida chiqmoqda, ya’ni ularning ehtimolligi teng ulushda.
Xo’sh bu ehtimollikni teng ulushda taqsimlayotgan narsa nimaga bog’liq deb o’ylaysiz?
Seed
Seed - bu urug’. Yani random obyektiga qandaydir qiymatli seed bersak shunga mos bo’lgan qiymat qaytaradi. Bir xil qiymatli seedlar berish bir xil qiymatlar qaytishini ta’minlaydi.
Xo’sh unda yuqoridagi holatda barchaning ~20 % ehtimolligi qanday sodir bo’lmoqda?
System.currentTimeMillis()
Java va boshqa dasturlash tillarida joriy vaqtni millisekundlarda(yoki nano) olish metodlari mavjud. Aynan java tilida System.currentTimeMillis() orqali joriy vaqt qiymatni millisekundlarda hisobida olamiz.
Java’dagi new Random() konstruktori ichida System.currentTimeMillis() bilan boshqa bir atomik uzun son (seedUniquifier()) XOR (^) qilinadi.
Seedni qo’lda berish mumkinmi
Ha seedni qo’lda berishimiz mumkin yuqoridagi code qismida random obyektini yaratish vaqtida konstruktor parametri sifatida seed qiymatni qo’shish orqali orqali kimningdir ehtimolligini 100% ga chiqarishimiz mumkin:
Random random = new Random();
Random random = new Random(200);
for (int i = 0; i < 100_000; i++) {
int randomNum = random.nextInt(people.size());
Person chosenPerson = people.get(randomNum);
counter.put(chosenPerson.getId(), counter.get(chosenPerson.getId()) + 1);
}
Example.java
Va natija :
Javlon: 0 marta chiqdi (Ehtimollik: 0,00%)
Javohir: 0 marta chiqdi (Ehtimollik: 0,00%)
Jamshid: 0 marta chiqdi (Ehtimollik: 0,00%)
Jasur: 0 marta chiqdi (Ehtimollik: 0,00%)
Oysha: 100000 marta chiqdi (Ehtimollik: 100,00%)
Process finished with exit code 0bash
Tushuntirish: Biz seedni sikl ichida har safar bir xil qiymat berish orqali Oyshaning ehtimolligini 100% ga chiqardik
Haqiqiy random nimaga asoslanib olinadi
Haqiqiy random ko’pincha tabiat hodisalari (tartibsizlik) lardan olinadi. Masalan: Atmosfera va Tabiat Shovqinlari, Kvant Mexanikasi (Fotonlarning harakati, Yarim o’tkazgichlardagi mikroskopik shovqinlar), hokazo…
Gigant tizimlar (Google, Cloudflare, Linux) random qiymatlarni qanday hosil qiladi ?
Dunyo internet trafigining katta qismini himoya qiluvchi Cloudflare kompaniyasi eng qiziqarli usuldan foydalanadi.
-
Ularning San-Fransiskodagi bosh idorasida devorga o’rnatilgan o’nlab lava chiroqlari bor. Kamera bu chiroqlarni tinimsiz videoga oladi.
-
Suyuqlikning betartib harakati, xonadagi yorug’likning o’zgarishi va kameraning mikroskopik shovqinlari piksellar ketma-ketligiga aylanadi. Bu ma’lumotlar global internet kalitlarini yaratish uchun seed (boshlang’ich qiymat) bo’lib xizmat qiladi.
Ogoh bo’ling
Agar onlayn kazino yoki o’yin platformalari oddiy va taxmin qilinadigan random algoritmlaridan foydalansa, tizim egalari seed qiymatini manipulyatsiya qilish orqali foydalanuvchilarni osongina yutqazishga majbur qila oladilar.