გსურთ გათამაშების გამარჯვებულის გამოვლენა, მოსწავლის გამოძახება, თუ იმის გადაწყვეტა, ვინ წავა პურზე? ეს უფასო ონლაინ ინსტრუმენტი სამართლიანად და შემთხვევითად ირჩევს ელემენტს თქვენ მიერ ჩასმული ნებისმიერი სიიდან. უბრალოდ შეიყვანეთ თქვენი ვარიანტები ველში „ელემენტები“ — თითოეული ახალ ხაზზე ან მძიმეებით გამოყოფილი — მიუთითეთ სასურველი შედეგების რაოდენობა ველში „რაოდენობა“ და დააჭირეთ ღილაკს „გენერაცია“. სია უნდა შეიცავდეს მინიმუმ ორ ელემენტს და შეუძლია დაიტიოს 1000-მდე ჩანაწერი, თითოეული მაქსიმუმ 200 სიმბოლოს სიგრძით.
თითოეული არჩევა ხორციელდება უშუალოდ თქვენს ბრაუზერში Web Crypto API-ის (crypto.getRandomValues) გამოყენებით, რომელიც უზრუნველყოფს კრიპტოგრაფიულად უსაფრთხო შემთხვევით მნიშვნელობებს თქვენი სისტემიდან. თქვენი სია არასოდეს იგზავნება სერვერზე, არ ინახება არსად და ჩვენ მას ვერასოდეს ვხედავთ — რაც აქ უფრო მნიშვნელოვანია, ვიდრე სხვა გენერატორების უმეტესობის შემთხვევაში, რადგან მომხმარებლებს ხშირად შეჰყავთ კლიენტების სია, კლასის ჟურნალი ან კოლეგების სახელები. ღილაკი „ჩატვირთვა ფაილიდან“ ასევე ინარჩუნებს ამ დაპირებას: თქვენი ბრაუზერი თავად კითხულობს ფაილს და ავსებს ველს ლოკალურად, ისე რომ არაფერი იტვირთება ინტერნეტში.
პარამეტრები შექმნილია იმ სიებისთვის, რომლებსაც მომხმარებლები რეალურად იყენებენ. ველი „გამყოფი“ ნაგულისხმევად დაყენებულია ვარიანტზე „ავტომატური“, რომელიც დამოუკიდებლად განასხვავებს ახალ ხაზებსა და მძიმეებს, ამიტომ ცხრილიდან, ჩატიდან ან დოკუმენტიდან დაკოპირებული სია მუშაობს ყოველგვარი დამატებითი ფორმატირების გარეშე. ჩაკეტეთ ის ვარიანტზე „ახალი ხაზი“, „მძიმე“ ან „ჰარი“, როდესაც თქვენს მონაცემებში შერეული ფორმატებია — გაითვალისწინეთ, რომ ვარიანტი „ჰარი“ ყოველთვის შეგნებული არჩევანია და არასოდეს მოქმედებს ავტომატურად, რადგან ისეთი ელემენტები, როგორიცაა სრული სახელები, თავად შეიცავს ჰარებს, და მათი ავტომატური დაყოფა უფრო მეტ სიას გააფუჭებდა, ვიდრე შეაკეთებდა. ველი „რაოდენობა“ განსაზღვრავს, თუ რამდენი ელემენტი უნდა შეირჩეს, 1-დან 100-მდე. გსურთ 200 მონაწილიდან სამი გამარჯვებულის გამოვლენა? ჩასვით მონაწილეები, დააყენეთ „რაოდენობა“ 3-ზე და დააჭირეთ ღილაკს „გენერაცია“. ორი პარამეტრი ხელმისაწვდომი ხდება მხოლოდ მაშინ, როცა რაოდენობა 2 ან მეტია, მანამდე კი არააქტიური რჩება: გადამრთველი „გამეორების გარეშე“, რომელიც წყვეტს, შეიძლება თუ არა ერთი და იგივე ელემენტის ორჯერ ამოღება, და „გამოტანის ფორმატი“, რომელიც განსაზღვრავს შედეგების გამოყოფის წესს — „თითოეული ახალ ხაზზე“, „ჰარით გამოყოფილი“ ან „მძიმით გამოყოფილი“.
ღილაკების რიგი ველში „ელემენტები“ ასრულებს რედაქტირებას, რისი გაკეთებაც სხვა შემთხვევაში სხვაგან მოგიწევდათ. ღილაკი „ჩატვირთვა ფაილიდან“ პირდაპირ კითხულობს სიას მარტივი ტექსტური ან CSV ფაილიდან. ღილაკი „ჩარევა“ ურევს ველში არსებული ჩანაწერების მიმდევრობას, „დალაგება“ აწყობს მათ ანბანური და ბუნებრივი რიცხვითი თანმიმდევრობით (ხოლო მეორე დაჭერა აბრუნებს მათ), ხოლო „გასუფთავება“ მთლიანად აცარიელებს ველს. ღილაკი „შეავსეთ ნიმუშის მონაცემები“ ამატებს მოკლე სატესტო სიას, რათა ერთი კლიკით სცადოთ ინსტრუმენტი, ხოლო „გაფართოება, რათა მოერგოს შინაარსს“ შლის ველს გრძელი სიის სრულად საჩვენებლად და „ჩაკეცვა ნაგულისხმევ ზომამდე“ აბრუნებს მას საწყის მდგომარეობაში. შედეგის ქვემოთ, „ყველას კოპირება“ აკოპირებს თითოეულ არჩევანს თქვენს ბუფერში, „ფაილში შენახვა“ ინახავს მათ თქვენს მოწყობილობაში, ხოლო „ისტორია“ ინახავს თქვენს ბოლო 10 გათამაშებას ბრაუზერში, ასე რომ წინა შედეგი ერთი კლიკით არის ხელმისაწვდომი.
როგორ ხდება არჩევა რეალურად? როდესაც აჭერთ ღილაკს „გენერაცია“, გვერდი ითხოვს ბრაუზერისგან შემთხვევით მნიშვნელობებს crypto.getRandomValues ფუნქციის მეშვეობით და იყენებს მათ თქვენს სიაში პოზიციების ასარჩევად, ნაცვლად JavaScript-ის ფსევდო-შემთხვევითი Math.random() ფუნქციისა. სუფთა 32-ბიტიანი მნიშვნელობის პოზიციად გადაქცევა სწორედ ის ადგილია, სადაც მსგავსი ინსტრუმენტები შეუმჩნევლად ცდებიან: ამ მნიშვნელობის სიის სიგრძეზე გაყოფა და ნაშთის (მოდულის) აღება ყველაზე აშკარა, მაგრამ ამავდროულად მიკერძოებული მიდგომაა. მიზეზი ის არის, რომ გარდა იმ შემთხვევისა, როცა რიცხვი 2^32 უნაშთოდ იყოფა სიის სიგრძეზე, სიის დასაწყისში მყოფი ელემენტები ოდნავ უფრო ხშირად ამოვარდება, ვიდრე სხვები. ამ ხარვეზს მოდულის მიკერძოება (modulo bias) ეწოდება და ის სრულად გაზომვადია და არა მხოლოდ თეორიული. ეს ინსტრუმენტი ამის ნაცვლად აგდებს ნებისმიერ მნიშვნელობას, რომელიც აღემატება სიის სიგრძის უდიდეს ზუსტ ჯერადს, და თავიდან ირჩევს — ტექნიკას ეწოდება უარყოფითი შერჩევა (rejection sampling). ეს მოითხოვს რამდენიმე დამატებით არჩევას ფონურ რეჟიმში, მაგრამ მიახლოებითის ნაცვლად ზუსტ გარანტიას იძლევა. სიაში პოზიცია არაფერს ცვლის: პირველ და ბოლო ელემენტს თითოეულ გათამაშებაში აბსოლუტურად თანაბარი ალბათობა აქვთ.
გადამრთველი „გამეორების გარეშე“ ყოფს გათამაშების ორ სრულიად განსხვავებულ ტიპს, რომელთაგან თითოეულს სტატისტიკაში თავისი სახელი აქვს. როდესაც ის ჩართულია, ინსტრუმენტი ურევს თქვენი სიის ასლს Fisher-Yates-ის ალგორითმით და იღებს ელემენტებს ზემოდან — ზუსტად ისევე, როგორც ქუდიდან ქაღალდების ამოღება მათი უკან დაბრუნების გარეშე, ასე რომ არავინ ირჩევა ორჯერ და ამ ზომის თითოეულ ჯგუფს თანაბარი ალბათობა აქვს. ამას ჰქვია შერჩევა დაბრუნების გარეშე (sampling without replacement), და ეს ზუსტად ისაა, რაც გჭირდებათ პრიზების, გუნდებისა და რიგითობის განაწილებისთვის. როდესაც ის გამორთულია, თითოეული არჩევანი კეთდება დამოუკიდებლად მთელი სიიდან, ამიტომ ერთი და იგივე ელემენტი შეიძლება ამოვარდეს ერთზე მეტჯერ — ეს არის შერჩევა დაბრუნებით (sampling with replacement), რაც საჭიროა მაშინ, როცა ყველა რჩება მონაწილედ თითოეულ რაუნდში, მაგალითად, თანმიმდევრული გათამაშებების ან სწრაფი სტატისტიკური შერჩევის დროს. არცერთი რეჟიმი არ არის მეორეზე უფრო სამართლიანი; ისინი უბრალოდ სხვადასხვა საჭიროებებს პასუხობენ.
სამართლიანი არჩევა არ უნდა გამოიყურებოდეს სამართლიანად. თუ ათი სახელიდან ხუთს ამოიღებთ, რეგულარულად დაინახავთ ორ არჩევანს, რომლებიც საწყის სიაში გვერდიგვერდ იყო, ან ერთსა და იმავე სახელს ორჯერ ზედიზედ, როცა გამეორება ნებადართულია — და თითოეული ეს შემთხვევა სრულიად ჩვეულებრივია. თითოეული გათამაშება დამოუკიდებელია: წინა არჩევნებს აბსოლუტურად არავითარი გავლენა არ აქვს მომდევნოებზე, და არცერთი ელემენტის გამარჯვების „რიგი“ არ მოდის მხოლოდ იმიტომ, რომ დიდი დრო გავიდა. ინსტინქტს, რომელიც საპირისპიროს ამტკიცებს, მოთამაშის შეცდომა (gambler's fallacy) ჰქვია, და ეს იგივე ინსტინქტია, რომელიც გვიშლის ხელს, თავად გავაკეთოთ შემთხვევითი არჩევანი — როცა გვთხოვენ შემთხვევით არჩევას, ჩვენ თავს ვარიდებთ პირველ და ბოლო ელემენტს, ვცდილობთ არ გავიმეოროთ სახელი და ვანაწილებთ ჩვენს არჩევანს გაცილებით უფრო თანაბრად, ვიდრე ამას ნამდვილი შემთხვევითობა აკეთებს. შედეგი, რომელიც საეჭვოდ მოწესრიგებულად გამოიყურება, ადამიანის ხელწერაა; ნამდვილი შემთხვევითობა კი გროვებს ქმნის.
რატომ უნდა გამოიყენოთ ეს შემთხვევითი არჩევის ინსტრუმენტი?
- არჩევა მხოლოდ ბრაუზერში: სია იკითხება თქვენს მოწყობილობაში და არსად იგზავნება
- Web Crypto API შემთხვევითობა: კრიპტოგრაფიულად უსაფრთხოა, ვიდრე Math.random()
- არანაირი მოდულის მიკერძოება: rejection sampling ინარჩუნებს თანაბარ შანსს თითოეული ელემენტისთვის
- სიის ნებისმიერი ფორმატი: თითოეული ახალ ხაზზე, მძიმით ან ჰარით, ფორმატირების შეცვლის გარეშე
- „გამეორების გარეშე“ რეჟიმი: აირჩიეთ გამარჯვებულები ან გუნდები ისე, რომ არავინ შეირჩეს ორჯერ
- იტევს 1000-მდე ელემენტს და იძლევა 100-მდე არჩევანის საშუალებას ერთ გათამაშებაში
- ჩაშენებული რედაქტირების ხელსაწყოები: ჩატვირთვა ფაილიდან, ჩარევა, დალაგება, გასუფთავება
- ისტორია და ფაილში შენახვა: შეინახეთ შედეგი, რომლის დასაბუთებაც შეიძლება მოგიწიოთ
- შეუზღუდავი და უფასო: არანაირი რეგისტრაცია, არანაირი ლიმიტი, არაფერი ინახება ჩვენს სერვერებზე
შემთხვევითი არჩევა საჭირო ხდება ყველგან, სადაც გადაწყვეტილებამ კითხვებს უნდა გაუძლოს. მასწავლებლები მიკერძოების გარეშე იძახებენ მოსწავლეებს და ყოფენ კლასს პროექტის ჯგუფებად. სტრიმერები და მარკეტოლოგები ავლენენ გათამაშების გამარჯვებულებს იმ აუდიტორიის წინაშე, რომელმაც შედეგი უნდა დაიჯეროს. მენეჯერები ანაწილებენ დავალებებს, რომელთა შესრულებაც არავის სურს, ხოლო გუნდები წყვეტენ პრეზენტაციების ან მორიგეობის რიგითობას. მკვლევარები იღებენ ჩანაწერების შემთხვევით ნიმუშს აუდიტისთვის. ოჯახები ასრულებენ კამათს იმაზე, თუ რას უყურონ, ხოლო მშიერი ჯგუფი ირჩევს სახინკლეს. ყველა ამ შემთხვევის საერთო მახასიათებელია არჩევანი, რომლის ახსნაც მოგვიანებით ნებისმიერს შეუძლია: გათამაშება იყენებს კრიპტოგრაფიულ შემთხვევითობას, ის მთლიანად მიმდინარეობს თქვენს მოწყობილობაზე და განყოფილება „ისტორია“ ინახავს შედეგს, თუ ვინმე მოგვიანებით იკითხავს ამის შესახებ.
მნიშვნელოვანია ვიცოდეთ ამ ინსტრუმენტის რამდენიმე პატიოსანი შეზღუდვა. მას არ შეუძლია აირჩიოს უფრო მეტი განსხვავებული ელემენტი, ვიდრე თქვენს სიაშია — სამ გამარჯვებულს სჭირდება მინიმუმ სამი სახელი — და მისი ლიმიტია 1000 ჩანაწერი, თითოეული 200 სიმბოლოთი, მაქსიმუმ 100 არჩევით ერთ გათამაშებაში. ღილაკები „ჩარევა“ და „დალაგება“ მუშაობს ხაზობრივად, ამიტომ ერთ ხაზზე ჩასმული, მძიმეებით გამოყოფილი სია გადაეწყობა მხოლოდ მას შემდეგ, რაც ის გარდაიქმნება თითო ელემენტად თითო ხაზზე; და ორივე ცვლის მხოლოდ ველის მიმდევრობას და არა თავად გათამაშებას, რომელიც თანაბრად სამართლიანია თქვენი ჩანაწერების თანმიმდევრობის მიუხედავად. თითოეულ ელემენტს თავდაპირველად ზუსტად ერთნაირი წონა აქვს, ამიტომ გათამაშებაში, სადაც ერთმა სახელმა ორმაგი შანსი უნდა მიიღოს, საჭიროა ამ სახელის სიაში ორჯერ ჩაწერა. ამ შეზღუდვების ფარგლებში, გარანტია მყარია — თქვენს სიაში არსებულ თითოეულ ელემენტს აქვს აბსოლუტურად თანაბარი შანსი ყოველ ცალკეულ გათამაშებაში.