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 fayllar mavjud:

package eunums;

public enum Gender {
    MALE,
    FEMALE;
}
package model;

import eunums.Gender;

public class Person {

    private Integer id;

    private String firstName;

    private String lastName;

    private  Integer age;

    private Gender gender;


    public Person(Integer id, String firstName, String lastName, Integer age, Gender gender) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
        this.gender = gender;
    }

    public Integer getId() {
        return id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Gender getGender() {
        return gender;
    }

    public void setGender(Gender gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                '}';
    }
}

hamda loyihani ishga tushuruvchi 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);
        }
    }
}

Natija:

"C:\Program Files\Java\jdk-26.0.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2026.1.4\lib\idea_rt.jar=5820" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\Users\root\IdeaProjects\javlon-blog\out\production\javlon-blog random.Example
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 0

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 codega random.setSeed(yourSeedValue) ni qo’shish orqali orqali kimnidir ehtimolligini 100% ga chiqarishimiz mumkin:

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++) {
            random.setSeed(200);
            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);
        }


    }
}

Va natija :

"C:\Program Files\Java\jdk-26.0.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2026.1.4\lib\idea_rt.jar=6337" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\Users\root\IdeaProjects\javlon-blog\out\production\javlon-blog random.Example
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 0

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