Je, unahitaji kuendesha droo ili kumpata mshindi, kumwita mwanafunzi, au kuamua nani ataosha vyombo? Chombo hiki cha mtandaoni cha kuchagua nasibu bila malipo kinachagua kwa haki kutoka kwenye orodha yoyote unayobandika. Weka vipengee vyako kwenye kisanduku cha «Vipengee» — kila kimoja kwenye mstari wake, au vikitenganishwa kwa koma — weka idadi unayotaka kwa kutumia «Idadi», kisha ubofye «Tengeneza». Orodha inahitaji angalau vipengee viwili na inaweza kubeba hadi majina 1000, kila moja likiwa na hadi herufi 200.
Kila uchaguzi unafanywa moja kwa moja kwenye kivinjari chako kwa kutumia Web Crypto API (crypto.getRandomValues), ambayo hutoa nambari za nasibu zilizo salama sana za kriptografia kutoka kwenye mfumo wa msingi wa kivinjari chako. Orodha yako haitumwi kamwe kwenye seva yoyote, haihifadhiwi kwenye kumbukumbu, na wala haionekani kwetu — na hili ni muhimu sana hapa kuliko kwenye programu nyingi za kutengeneza nasibu, kwa sababu kile ambacho watu hubandika mara nyingi ni orodha ya wateja, sajili ya darasa, au majina ya wafanyakazi wenzao. Kitufe cha «Pakia kutoka kwa faili» kinadumisha ahadi hiyohiyo: kivinjari chako kinasoma faili lenyewe na kujaza kisanduku hapohapo kwenye kifaa, bila kupakia chochote popote pale.
Chaguo zilizopo zimeundwa kwa ajili ya orodha ambazo watu wanazo kiuhalisia. «Njia ya mgawanyiko wa thamani» imewekwa kwenye «Utambuzi otomatiki», ambayo inasoma mistari mipya na koma na kutambua ni ipi kati ya hizo inatumiwa na orodha yako, hivyo orodha iliyonakiliwa kutoka kwenye lahajedwali, ujumbe wa gumzo, au makala inafanya kazi bila kuhitaji kupangwa upya. Ifunge kwenye «Mstari mpya», «Koma», au «Nafasi» wakati data yako inachanganya miundo tofauti — na kumbuka kuwa «Nafasi» siku zote ni chaguo la kukusudia na kamwe haliwi otomatiki, kwa sababu vipengee kama vile majina kamili vina nafasi zake na kuvigawanya kwa nafasi bila kukusudia kungeharibu orodha nyingi kuliko kuzirekebisha. «Idadi» inabainisha ni vipengee vingapi vya kuchagua kwenye droo, kuanzia 1 hadi 100. Je, unaendesha droo ya washindi watatu kutoka kwa washiriki 200? Bandika washiriki, weka «Idadi» iwe 3, na ubofye «Tengeneza». Vidhibiti viwili vinatumika tu wakati idadi ni 2 au zaidi, na vinabaki vimefifia hadi wakati huo: «Ya kipekee», ambayo inabainisha iwapo kipengee kilekile kinaweza kuchaguliwa mara mbili, na «Muundo wa matokeo», ambayo inaweka jinsi majina yaliyochaguliwa yanatenganishwa — «Mstari mpya», «Imetenganishwa kwa nafasi», au «Imetenganishwa kwa koma».
Mstari wa vitufe ndani ya kisanduku cha «Vipengee» unafanya uhariri ambao ungelazimika kuufanya kwingineko. «Pakia kutoka kwa faili» inavuta orodha moja kwa moja kutoka kwenye faili la maandishi ya kawaida au CSV. «Changanya» inapanga upya vipengee kwenye kisanduku, «Panga» inavipanga kwa kufuata alfabeti huku nambari zikipangwa kwa mtiririko wa asili na kubofya mara ya pili kunageuza mpangilio huo kuwa kinyume, na «Futa» inaondoa kila kitu kwenye kisanduku. «Jaza na data ya sampuli» inaweka orodha fupi ya mfano ili uweze kujaribu chombo hiki kwa mbofyo mmoja, huku «Panua ili kutoshea maudhui» inafungua kisanduku kuonyesha orodha ndefu kwa ukamilifu, na «Kunja kwa saizi chaguomsingi» inakirudisha katika ukubwa wake wa kawaida. Chini ya matokeo, «Nakili Vyote» inaweka kila jina lililochaguliwa kwenye ubao wako wa kunakili, «Hifadhi kwenye faili» inayahifadhi kama faili kwenye kifaa, na «Historia» inaweka droo zako 10 za mwisho kwenye kivinjari chako, hivyo matokeo ya awali yanapatikana kwa mbofyo mmoja tu.
Je, uchaguzi unafanywaje hasa? Unapobofya «Tengeneza», ukurasa unaomba nambari za nasibu kwenye kivinjari kupitia crypto.getRandomValues na unazitumia kuchagua nafasi katika orodha yako, badala ya kupitia kikokotoo dhaifu cha nasibu cha JavaScript kama Math.random(). Kubadilisha thamani ghafi ya biti 32 kuwa nafasi katika orodha ndiko kunasababisha vyombo vingi vya nasibu kufanya makosa kimyakimya: kuchukua thamani hiyo na kuigawanya kwa modulo kulingana na urefu wa orodha ni mbinu rahisi lakini inayoleta upendeleo, kwa sababu isipokuwa 2^32 igawanywe kwa usawa na urefu wa orodha, vipengee vilivyo karibu na mwanzo wa orodha hutokea mara nyingi kidogo zaidi kuliko vingine. Dosari hiyo inaitwa modulo bias, na inaweza kupimika na si dhana tu. Badala yake, chombo hiki kinatupa thamani yoyote inayozidi kigawe kamili kikubwa zaidi cha urefu wa orodha na kufanya droo tena — mbinu inayoitwa rejection sampling. Inagharimu droo chache za ziada na kununua uhakikisho kamili badala ya makadirio. Nafasi katika orodha haibadilishi chochote: kipengee cha kwanza na cha mwisho vinabeba uwezekano sawa kwenye kila droo.
«Ya kipekee» inatenganisha aina mbili tofauti kabisa za droo, na sayansi ya takwimu ina jina kwa kila moja. Ikiwa imewashwa, chombo kinachanganya nakala ya orodha yako kwa kutumia algoriti ya Fisher-Yates na kuchukua vipengee kuanzia juu — sawa kabisa na kuokota kura kutoka kwenye kofia bila kuzirudisha, hivyo hakuna anayechaguliwa mara mbili na kila kikundi cha ukubwa huo kina uwezekano sawa wa kutokea. Hiyo ni sampling without replacement, na ndiyo unayotaka kwa ajili ya kuwapata washindi wa zawadi, timu, na mpangilio wa zamu. Ikiwa imezimwa, kila uchaguzi unafanywa kwa kujitegemea kutoka kwenye orodha nzima, hivyo kipengee kilekile kinaweza kutokea zaidi ya mara moja — sampling with replacement, ambayo ndiyo unayotaka wakati kila mtu anaendelea kuwa na sifa katika kila mzunguko, kama vile kwenye droo zinazojirudia au sampuli ya haraka ya takwimu. Hakuna mfumo ulio wa haki zaidi kuliko mwingine; yanajibu maswali tofauti.
Droo yoyote iliyo ya haki kweli haifai kuonekana kuwa ya haki. Endesha droo ya majina matano kati ya kumi na mara kwa mara utaona majina mawili yaliyokuwa karibiana katika orodha ya asili yamechaguliwa mfululizo, au jina lilelile kutokea mara mbili mfululizo wakati wa kuruhusu majina kujirudia, na kila moja ya haya ni ya kawaida. Kila droo inajitegemea: chaguzi zilizopita hazina ushawishi wowote kwa zile zinazofuata, na hakuna yeyote anayekuwa na «zamu ya kushinda» iliyofika. Silika inayosisitiza kinyume chake ni gambler's fallacy, na ni silika hiyohiyo inayotufanya kuwa dhaifu tunapojaribu kufanya uchaguzi wa nasibu sisi wenyewe — tukitakiwa kuchagua kwa nasibu, tunaepuka kipengee cha kwanza na cha mwisho, tunaepuka kurudia jina, na tunasambaza chaguzi zetu kwa usawa zaidi kuliko jinsi bahati nasibu hufanya. Matokeo yanayoonekana kuwa safi sana kwa kutiliwa shaka ni alama ya vidole ya binadamu; nasibu ya kweli huwa inatengeneza mafungu yasiyotarajiwa.
Kwa nini uchague chombo hiki cha nasibu?
- Uteuzi ndani ya kivinjari: orodha yako inasomwa kwenye kifaa chako na haitumwi popote
- Nasibu ya Web Crypto API: ni salama kwa njia ya kriptografia, siyo Math.random()
- Hakuna modulo bias: rejection sampling inaweka kila kipengee katika uwezekano sawa
- Muundo wowote wa orodha: mstari mmoja mmoja, kwa koma, au nafasi, bila kupanga upya
- Mfumo wa «Ya kipekee»: chagua washindi au timu huku hakuna anayechaguliwa mara mbili
- Hadi vipengee 1000, na hadi chaguzi 100 kwenye droo moja
- Zana za orodha zilizojengewa ndani: pakia kutoka faili, changanya, panga, futa, data ya sampuli
- Historia na Hifadhi kwenye faili: weka rekodi ya droo ambayo huenda ukalazimika kuitetea
- Haina kikomo na bila malipo: hakuna kujisajili, hakuna kikomo cha matumizi, hakuna chochote kwenye seva zetu
Uchaguzi wa nasibu unajitokeza kila mahali ambapo uamuzi unahitaji kudumu pindi unapohojiwa. Walimu wanawaita wanafunzi bila upendeleo na kuligawa darasa katika vikundi vya mradi. Watangazaji mubashara (streamers) na wauzaji huendesha droo za zawadi na bahati nasibu mbele ya hadhira ambayo inapaswa kuamini matokeo hayo. Mameneja hutoa majukumu ambayo hakuna anayejitolea kuyafanya, na timu huamua mpangilio wa maonyesho au nani yuko kwenye zamu ya wito (on-call). Watafiti wanavuta sampuli ya nasibu ya rekodi kwa ajili ya ukaguzi. Familia zinamaliza ubishi wa filamu gani ya kutazama, na kikundi chenye njaa kinachagua mkahawa. Jambo linalounganisha yote haya ni uteuzi ambao mtu yeyote anaweza kueleza baadaye: droo inatumia nasibu ya kriptografia, inafanyika kikamilifu kwenye kifaa chako, na «Historia» inaweka matokeo ikiwa mtu atayauuliza baadaye.
Viwango vichache vya ukweli vya chombo hiki vinafaa kujulikana. Chombo hakiwezi kuchagua vipengee vingi tofauti kuliko vile vilivyo kwenye orodha yako — washindi watatu wanahitaji angalau majina matatu — na kinaishia kwenye vipengee 1000 vyenye herufi 200 kila kimoja, kukiwa na hadi chaguzi 100 katika droo moja. «Changanya» na «Panga» zinafanya kazi mstari kwa mstari, hivyo orodha iliyotenganishwa kwa koma iliyobandikwa kwenye mstari mmoja hupangwa upya tu baada ya kuwekwa kwenye muundo wa kipengee kimoja kwa kila mstari; na zote mbili zinapanga upya kisanduku badala ya droo yenyewe, ambayo hubaki kuwa ya haki sawa haijalishi vipengee vyako vimepangwa kwa utaratibu gani. Pia, kila kipengee kinabeba uzito sawa kwa muundo wake, kwa hivyo droo ambapo jina moja linapaswa kuhesabiwa mara mbili linahitaji jina hilo kuorodheshwa mara mbili. Ndani ya mipaka hiyo, uhakikisho huo ni madhubuti — kila kipengee katika orodha yako kina nafasi sawa, katika kila droo.