Skip to content
Javlon's Blog
Ortga qaytish

Tasodiflar tasodifmi

Tasodifiylik

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.

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.

Obuna Bo'ling

Yangi maqolalar va qisqa qaydlarni @javlonergashev_blog telegram kanalida kuzatib boring.


Ulashish:

Oldingi post
Yugurish
Keyingi post
Sug'ur kuni