May bumubunot ng panalo sa raffle gamit ang mga ganito, kaya hinahawakan ito sa pamantayan ng password generator, hindi ng laruan.
Dalawang bagay ang mali sa halos lahat ng picker sa web, at pareho silang hindi nakikita maliban kung bibilangin mo.
Una, ang Math.random. Hindi ito cryptographic — nababawi ang panloob nitong estado mula sa maikling serye ng output, at pagkatapos alam na ang lahat ng nakaraan at darating.
Pangalawa, ang modulo bias. Mukhang patas ang byte % 6 pero hindi: hindi nahahati ang 256 sa 6, kaya mga 2% na mas madalas lumabas ang apat sa anim na mukha. Itinatapon dito ang bunot na nahuhulog sa kulang na huling bloke at inuulit — ilang byte lang ang gastos, at pantay-pantay na lahat.
At hindi shuffle ang sort(() => Math.random() - 0.5). Nakadepende ang resulta sa algorithm ng browser, at may mga pagkakasunod na paulit-ulit lumalabas. Fisher-Yates ang ginagamit dito.
Bumubunot ito mula sa crypto.getRandomValues, ang cryptographic na pinagkukunan ng random ng browser — ang gamit din ng password generator sa site na ito. Sinasadyang hindi ginagamit ang Math.random kahit saan dito: hindi ito cryptographic at nababawi ang panloob nitong estado mula sa maikling serye ng output, at pagkatapos ay alam na ang bawat nakaraan at darating na halaga. Mahalaga iyon sa raffle.
Ito ang bug sa halos lahat ng picker sa web, at hindi ito nakikita maliban kung bibilangin mo. Mukhang patas ang pagkuha ng random na byte at paggawa ng "byte % 6" pero hindi: hindi nahahati ang 256 sa 6, kaya apat sa anim na mukha ang lumalabas nang mga 2% na mas madalas kaysa sa dalawa. Ang solusyon ay itapon ang anumang bunot na nahuhulog sa kulang na huling bloke at umulit, na ilang byte lang ang gastos at ginagawang eksaktong pantay-pantay ang bawat kalalabasan. Iyon ang ginagawa nito.
Dahil sinisira ng comparator na hindi pare-pareho ang sagot ang kasunduang inaasahan ng bawat sort algorithm. Nakadepende ang resulta sa algorithm na ginagamit ng browser mo at sa orihinal na pagkakasunod ng listahan, at may mga pagkakaayos na ilang beses na mas madalas lumabas kaysa sa iba. Sikat ang one-liner na iyon at mali. Fisher-Yates ang gamit dito, na minsan lang dumadaan sa bawat puwesto at napapatunayang pantay.
Nananatili silang dalawa sa bunutan, at sinasabi sa iyo ng pahina na may doble. Puwedeng talagang dalawang tao ang tawaging Maria, at ang tahimik na pagsasanib sa kanila ay magpapakalahati sa tsansa niyang manalo. Ito ang uri ng bagay na lumilitaw lang pagkatapos maibigay ang premyo, kaya sinasabi na ito nang maaga — puwede mong burahin ang isa kung maling type lang iyon.
Hinahalo nito ang buong listahan, tapos isa-isang ipinamamahagi sa mga grupo, gaya ng baraha. Mahalaga iyon kapag hindi nahahati nang pantay ang bilang: pinapanatili ng pamamahagi na hindi lalagpas sa isang miyembro ang pagkakaiba ng bawat grupo, samantalang ang paghiwa ng hinalong listahan sa bloke ay ibinubuhos ang buong natira sa huling grupo.
Hindi, at sinasadya iyon. Kailangan ng seed para maulit ang bunutan, at ang seed na kahit sino ay puwedeng magtakda ay bunutang kahit sino ay puwedeng magmaniobra — at iyon mismo ang ayaw mo sa isang raffle. Kung kailangan mong patunayan ang resulta, itala ito habang nangyayari: kuhanan ng screenshot nang sabay ang listahan at ang kalalabasan, o bumunot sa harap ng mga kasangkot.
Runs entirely in your browser; nothing is transmitted. Draws come from crypto.getRandomValues with rejection sampling — never Math.random, and never a random sort comparator. Duplicates in your list are reported, not removed. Walang ipinapadala sa mga server namin ang tina-type mo rito — sa browser mo tumatakbo nang buo ang pagkuwenta.