გჭირდებათ სწრაფი და სამართლიანი გზა შემთხვევითი რიცხვის მისაღებად? ეს უფასო ონლაინ შემთხვევითი რიცხვების გენერატორი ქმნის ერთ რიცხვს — ან რიცხვების მთლიან სიას — თქვენ მიერ არჩეულ ნებისმიერ დიაპაზონში, მარტივი 1-დან 10-მდე დიაპაზონიდან დაწყებული მილიარდებამდე მიმავალი დიაპაზონებით დამთავრებული. დააყენეთ მინიმალური და მაქსიმალური მნიშვნელობები ველებში „მინ“ და „მაქს“, აირჩიეთ, რამდენი რიცხვია საჭირო, ველში „რაოდენობა“, და დააჭირეთ ღილაკს „გენერაცია“. ორივე საზღვარი შედის შედეგში, ასე რომ 1-დან 10-მდე დიაპაზონმა შეიძლება დააბრუნოს როგორც 1, ისე 10.
თითოეული შედეგი იქმნება პირდაპირ თქვენს ბრაუზერში Web Crypto API-ის (crypto.getRandomValues) მეშვეობით — რომელიც უზრუნველყოფს კრიპტოგრაფიულად ძლიერ შემთხვევით მნიშვნელობებს თქვენი ოპერაციული სისტემის საბაზისო შემთხვევითობიდან. არაფერი იგზავნება სერვერზე, არაფერი ინახება ჟურნალში, და ჩვენ ვერასოდეს ვხედავთ თქვენს რიცხვებს. გენერაცია მყისიერია, კონფიდენციალურია და აგრძელებს მუშაობას ნელი კავშირითაც კი, გვერდის ჩატვირთვის შემდეგ.
პარამეტრები შექმნილია იმ რეალური სიტუაციებისთვის, როცა ადამიანებს ნამდვილად სჭირდებათ შემთხვევითი რიცხვები. ჩართეთ „გამეორების გარეშე“, რათა არცერთი რიცხვი ორჯერ არ გამოჩნდეს — პარამეტრი, რომელიც გჭირდებათ წილისყრისთვის, ლატარიის სტილის გათამაშებებისთვის, ან ადამიანების ჯგუფებად გამეორების გარეშე დაყოფისთვის. გჭირდებათ ოცი გამარჯვებული 500 მონაწილიდან? დააყენეთ „მინ“ 1-ზე და „მაქს“ 500-ზე, ჩართეთ „გამეორების გარეშე“, დააყენეთ „რაოდენობა“ 20-ზე და დააჭირეთ ღილაკს „გენერაცია“. „დალაგების თანმიმდევრობა“ ალაგებს შედეგს ზრდადობით ან კლებადობით, ხოლო ერთი ღილაკი აკოპირებს ყველა შედეგს ერთდროულად. „გამოტანის ფორმატის“ „ახალი ხაზიდან“ „ჰარით გამოყოფილზე“ ან „მძიმით გამოყოფილზე“ გადართვისას ჩნდება ველი „ნაკრებების რაოდენობა“: რამდენიმე დამოუკიდებელი გათამაშება ერთდროულად — მაგალითად, ოცი ნაკრები, თითოეულში 3 რიცხვით, ოცი გათამაშების რაუნდისთვის — ხოლო „დუბლიკატების დაშვება ნაკრებებს შორის“ განსაზღვრავს, შეიძლება თუ არა ერთი და იგივე რიცხვი გამოჩნდეს ერთზე მეტ ნაკრებში.
როგორ იქმნება შემთხვევითობა სინამდვილეში? თქვენი ბრაუზერი უზრუნველყოფს კრიპტოგრაფიულად ძლიერ შემთხვევით მნიშვნელობებს Web Crypto API-ის მეშვეობით და არა JavaScript PRNG-ის, მაგალითად Math.random()-ის, მეშვეობით. „გენერაცია“ ღილაკზე დაჭერისას გვერდი ითხოვს შემთხვევით მნიშვნელობებს crypto.getRandomValues-ის მეშვეობით და იყენებს მათ თქვენს მიერ არჩეულ დიაპაზონში რიცხვების შესაქმნელად. შემთხვევითობის საბაზისო წყაროს უზრუნველყოფს ოპერაციული სისტემა, ამიტომ გვერდს არ სჭირდება საკუთარი საწყისი მნიშვნელობის (seed) ან ფსევდო-შემთხვევითი მიმდევრობის შენარჩუნება.
დაუმუშავებელი მნიშვნელობის თქვენს დიაპაზონზე გადატანა ზუსტად ის ადგილია, სადაც გენერატორები ჩუმად ცდებიან, და ის ცალკე აბზაცის ღირსია. დიაპაზონის ზომაზე მნიშვნელობის გაყოფის ნაშთის აღება აშკარა მიდგომაა და ამავე დროს მიკერძოებული: თუ 2^32 ზუსტად არ იყოფა დიაპაზონის ზომაზე, ყველაზე დაბალი რიცხვები ოდნავ უფრო ხშირად ჩნდება, ვიდრე დანარჩენები. ამ ხარვეზს modulo bias ჰქვია, და ის გაზომვადია და არა მხოლოდ თეორიული. ეს გენერატორი ამის ნაცვლად უარყოფს ნებისმიერ მნიშვნელობას, რომელიც აღემატება დიაპაზონის ყველაზე დიდ ზუსტ ჯერადს, და ისევ ქმნის რიცხვს — ტექნიკა, რომელსაც rejection sampling ჰქვია. ეს რამდენიმე დამატებით მცდელობას ჯდება, მაგრამ სანაცვლოდ იძლევა ზუსტ გარანტიას: „მინსა“ და „მაქსს“ შორის ყოველ რიცხვს აქვს სრულიად ერთნაირი ალბათობა, არა თითქმის ერთნაირი.
რა აქცევს რიცხვს ნამდვილად შემთხვევითად? რიცხვი საკმარისად შემთხვევითია, როცა წინა შედეგები არაფერს ამბობენ შემდეგზე — და პრაქტიკაში ამის სამი დონე არსებობს. ჩვეულებრივი ფსევდო-შემთხვევითი ფუნქცია, მაგალითად Math.random(), ასრულებს დეტერმინისტულ ალგორითმს: ვინც კი გაიგებს მის შიდა მდგომარეობას, შეძლებს მთელი მიმდევრობის აღდგენას, რაც მას შესაფერისს ხდის პრეზენტაციის სლაიდების არევისთვის, მაგრამ უვარგისს ნებისმიერისთვის, სადაც შედეგი პროგნოზირებადი არ უნდა იყოს. კრიპტოგრაფიულად უსაფრთხო გენერატორი (CSPRNG) — დონე, რომელსაც ეს ინსტრუმენტი იყენებს — ასევე ალგორითმია, მაგრამ შექმნილია, რათა შექმნას არაპროგნოზირებადი მნიშვნელობები სისტემური შემთხვევითობის უსაფრთხო წყაროს გამოყენებით, და აგებულია ისე, რომ მისი გამოსავლის დაკვირვება არაფერს ამჟღავნებს იმის შესახებ, თუ რა მოჰყვება შემდეგ. ფიზიკური შემთხვევითობა, ისეთი წყაროებიდან, როგორიცაა ატმოსფერული ხმაური ან რადიოაქტიური დაშლა, ორივე დონეზე მაღლა დგას, თუმცა პრაქტიკული განსხვავება ქრება, როცა საქმე დიაპაზონიდან რიცხვის შექმნას ეხება. სწორედ ამიტომ ბრაუზერები გვთავაზობენ ცალკე კრიპტოგრაფიულ API-ს, Math.random()-ის უბრალოდ გაუმჯობესების ნაცვლად: ეს ორი სხვადასხვა პრობლემას წყვეტს, და მხოლოდ ერთია უსაფრთხო, როცა შედეგი ვინმესთვის მნიშვნელოვანია.
შემთხვევით მიმდევრობას არ სჭირდება ადამიანებისთვის შემთხვევითი ჩანდეს. შექმენით ათი რიცხვი 1-სა და 10-ს შორის და რეგულარულად შეამჩნევთ გამეორებას, თითქმის-წყვილს, მაგალითად 7, 7, 8, ან მოკლე მიმდევრობას, რომელიც მხოლოდ მაღალი მნიშვნელობებისგან შედგება — და თითოეული ეს შემთხვევა სავსებით ჩვეულებრივია. ნამდვილი შემთხვევითობა არაპროგნოზირებადია, არა თანაბრად განაწილებული: თითოეული რიცხვი ჩნდება წინაზე დამოუკიდებლად, წინა რიცხვებს არანაირი გავლენა არ აქვთ შემდეგებზე, და არცერთ რიცხვს არასდროს არ აქვს გამოჩენის მეტი ალბათობა, ვიდრე მეორეს. ინსტინქტი, რომელიც საწინააღმდეგოს ამტკიცებს, არის მოთამაშის ცდომილება, და ეს იგივე ინსტინქტია, რომელიც ადამიანებს თავად აქცევს შემთხვევითი რიცხვების ცუდ გენერატორებად — როცა გვთხოვენ, შემთხვევითი მიმდევრობა მოვიფიქროთ, ჩვენ ვერიდებით გამეორებებს და ვანაწილებთ მნიშვნელობებს გაცილებით უფრო თანაბრად, ვიდრე ამას შემთხვევითობა ოდესმე გააკეთებდა. შედეგი, რომელიც საეჭვოდ მოწესრიგებული ჩანს, ადამიანის ხელწერაა; ნამდვილი შემთხვევითობა გროვებს ქმნის.
რატომ აირჩიოთ ეს შემთხვევითი რიცხვების გენერატორი?
- გენერაცია მხოლოდ ბრაუზერში: რიცხვები იქმნება თქვენს მოწყობილობაზე და არასოდეს იგზავნება არსად
- შემთხვევითობა Web Crypto API-ით: კრიპტოგრაფიულად უსაფრთხო, და არა Math.random()
- modulo bias-ის გარეშე: rejection sampling ინარჩუნებს თანაბარ ალბათობას დიაპაზონის ყოველი რიცხვისთვის
- ნებისმიერი დიაპაზონი: 1-დან 10-მდე მილიარდებამდე მიმავალ მნიშვნელობებამდე, ორივე საზღვარი შედის
- „გამეორების გარეშე“ რეჟიმი: შექმენით სია გამეორების გარეშე წილისყრისა და ჯგუფებად დაყოფისთვის
- მრავალი ნაკრები: რამდენიმე დამოუკიდებელი გათამაშება ერთი კლიკით
- დალაგება და გამოტანის ფორმატები: ზრდადობით ან კლებადობით, ახალი ხაზი, ჰარები ან მძიმეები
- ისტორია და ფაილში შენახვა: შეინახეთ გათამაშების ჩანაწერი, რომლის დასაბუთებაც შეიძლება დაგჭირდეთ
- შეუზღუდავი და უფასო: რეგისტრაციის გარეშე, გამოყენების შეზღუდვების გარეშე, არაფერი ინახება ჩვენს სერვერებზე
შემთხვევითი რიცხვები გამოიყენება გაცილებით მეტ ადგილას, ვიდრე ადამიანთა უმეტესობას მიაჩნია. მასწავლებლები იძახებენ მოსწავლეებს, ვინმეს უპირატესობის მინიჭების გარეშე. სტრიმერები და მარკეტინგული გუნდები ირჩევენ საჩუქრებისა და გათამაშებების გამარჯვებულებს აუდიტორიის წინაშე, რომელსაც სჯერა შედეგისა. მოთამაშეები ცვლიან დაკარგულ კამათელს ან წყვეტენ, ვინ იწყებს პირველი, ხოლო ტურნირებზე გათამაშებით განისაზღვრება საწყისი თანმიმდევრობა. მკვლევრები ირჩევენ შემთხვევით შერჩევას, რათა მათი დასკვნები მართებული იყოს იმ ადამიანებისთვისაც, რომლებიც კვლევაში არ მონაწილეობდნენ. დეველოპერები ქმნიან სატესტო მონაცემებს, აყენებენ საწყის მნიშვნელობას (seed) სიმულაციებისთვის და ირჩევენ იდენტიფიკატორებს QA-ის დროს. საერთო ხაზი შემთხვევითი შერჩევის პროცესია, რომლის ახსნაც შემდგომ შესაძლებელია: რადგან გათამაშება იყენებს კრიპტოგრაფიულ შემთხვევითობას და მთლიანად თქვენს მოწყობილობაზე ხდება, შეგიძლიათ აჩვენოთ, როგორ იქნა მიღებული შედეგი, თუკი ვინმე ეჭვქვეშ დააყენებს მას.
ამ გენერატორს აქვს რამდენიმე გონივრული შეზღუდვა, რომელთა ცოდნაც ღირს. „გამეორების გარეშე“ რეჟიმს არ შეუძლია შექმნას რიცხვები, რომელთა რაოდენობაც აღემატება დიაპაზონს: ოცი უნიკალური მნიშვნელობა 1-სა და 10-ს შორის უბრალოდ არ არსებობს. გათამაშებები დამოუკიდებელია და წინა შედეგები არ მოქმედებს შემდეგებზე, ამიტომ გვერდის განახლება არ აბრუნებს რომელიმე ციკლს თავიდან — უბრალოდ არ არსებობს ციკლი, რომელშიც შეიძლებოდით ყოფილიყავით. და მიუხედავად იმისა, რომ რიცხვები კრიპტოგრაფიულად ძლიერია, გათამაშება აქ არის სამართლიანი არჩევანი, და არა პროგნოზი: ლატარიის ოფიციალური გათამაშებები საკუთარ ფიზიკურ ან სერტიფიცირებულ აღჭურვილობას იყენებენ, და თქვენს ბრაუზერში გამოთვლილს არანაირი კავშირი არ აქვს მათთან. ამ შეზღუდვების ფარგლებში გარანტია მყარია: თქვენი დიაპაზონის ყოველ რიცხვს აქვს ზუსტად ერთნაირი შანსი, ყოველ ცალკეულ გათამაშებაზე.