🪜 Merdiven Oyunu (Amidakuji)
Çubuk çize tıklayınca, her oyuncu için bir dikey çizgi çizer ve ardından Math.random() kullanarak sabit 12 satırda yatay çubuklar dağıtır. Her çubuk sadece iki komşu çizgiyi değiştirir ve aynı satırdaki iki çubuk asla birbirine değmez. Bu nedenle, tüm merdiven matematiksel olarak her oyuncunun tam olarak bir sonuçla eşleşmesini garanti altına alır — çubukların nerede durduklarına bakılmaksızın kimse iki sonuç alamaz. Daha sonra bir isim tıklayınca, kanvas aynı merdiveni çizer ama o oyuncunun yolunu vurgular, böylece kararın adım adım izlenebilir hale gelir, sadece sonucun verilmesi yerine.
Ladder Game, JavaScript'in Math.random() fonksiyonunu kullanarak ve HTML Canvas API'sini kullanarak tarayıcınızda rastgele bir amidakuji (ghost-leg) loto merdiveni oluşturur. Her oyuncunun farklı bir sonuca ulaşmasını sağlar.
Tasarım gereği gizli. Bu araç, tarayıcınızda tamamen çalışır — girdiğiniz hiçbir şey yüklenmez ya da saklanmaz ve çevrimdışı da çalışır.
Hakkında
Burada bahsedilen adillik pazarlama değil, çubukların yerleştirilme şekli doğrudan bunu sağlar. Her 12 satır, her komşu çizgi çifti için Math.random() < 0.45 olasılığıyla bir çubuk yerleştirilir, ancak bir önceki çubuk varsa o konuma atlanır ("!(i > 0 && row[i-1])"). Bu tek koruma, bir satırın iki çakışan değişimi içeremeyeceği anlamına gelir, bu nedenle her satır, kendi başına çakışmayan değişimi temsil eden bir sütun permütasyonudur. On iki tane bu satırı üst üste yerleştirmek, sırayla on iki permütasyonun bileşimi demektir ve permütasyonların bileşimi her zaman bir permütasyon olur. Bu nedenle iki oyuncunun aynı sonuca ulaşması burada sadece olasılıksız değil, yapısal olarak imkânsızdır, rastgele atamalar ne şekilde olursa olsun.
Bu garanti, sonuçların tüm olası eşleşmeler arasında ne kadar eşit şekilde dağıldığını kapsamaz. Merdiven, her zaman sabit 12 satır kullanır, oyuncu sayısına bakılmaksızın. Araç, 3 ila 10 oyuncu aralığına ayarlanmıştır ve 12 satır, her biri %45 olasılıklı bağımsız atamalarla yeterince çakışmalar sağlar, böylece gerçek bir karıştırma hissi verir. Ancak 30 ya da 50 isim girdiğinizde, 12 satır tüm olası eşleşmeleri eşit olasılıklarla kaplamak için yeterli değildir. Bu durumda, kişiler başlangıç sütunlarına daha yakın kalma eğiliminde olur, bu da gerçekten eşit bir karıştırma ile karşılaştırıldığında daha az olasılıkla gerçekleşir. Eğer büyük bir gruba adil rastgele eşleştirme gerekirse, 12 satırın üstüne çıkamayan bir merdiven yerine, düz rastgele bir atama aracı daha iyi matematiksel bir araçtır.
Math.random() ne olduğuna ve ne olduğuna dair açık bir açıklama yapmak da faydalı olur. Bu, tarayıcının yerleşik pseudorandom sayı üreticisidir — hızlıdır, kimin yemek yapacağı gibi kararlar için yeterlidir ve genellikle sayfa dışından bir kullanıcı tarafından etkilenemez. Ancak kriptografik olarak güvenli değildir: iç durumu, birisi yeterince çıktıyı gözlemleyebilir ya da motorun algoritmasını biliyorsa, teorik olarak tahmin edilebilir. Bu nedenle gerçek para ile raffle'ler, lisanslı loto'lar ve yasal sonuçlar gerektiren her şey için crypto.getRandomValues() ya da denetlenen ve sertifikalı bir RNG kullanılır. Bu araç bu ikisinden birini kullanmaz ve bu nedenle kahve alacak kimin belirlenmesi gibi işlerde yeterlidir — ama gerçek ödül paraları bu araçla bağlamayın.
Etkileşim açısından: "Çubuk Çiz" butonu tüm çubuk yerleştirme rutinini yeniden başlatır, bu nedenle her tıklama önceki tıklamadan bağımsızdır. "Tümünü Göster" butonu tek tek isim tıklamadan her oyuncunun sonucunu aynı merdiven üzerinde bir kez gösterir. Bu sürümde "Kaydet", "İndir" veya "Paylaş" butonu yoktur — merdiven sadece kanvas elementindeki pikseller olarak mevcuttur ve sayfa yenilendiğinde kanvas ve iki metin kutusu örnek isimler ve ödüllerle yeniden başlatılır. Sonuç kaydı istiyorsanız, sadece tarayıcınızın veya cihazınızın kendi ekran görüntüsü aracıyla sayfadan ayrılmadan önce kullanmanız gerekir. Araçla ilgili diğer her şey tanıtımıyla tam olarak aynıdır: sayfa yüklendikten sonra tamamen istemci tarafında çalışır, hiçbir ağ isteği yapmaz, bu nedenle yazdığınız hiçbir şey yüklemez ve hiçbir bağlantı olmadan çalışır.
Nasıl kullanılır
- Oyuncular kutusuna her oyuncunun ismini satır satır girin — örnek isimler (Amy, Ben, Cara, Dan) sadece formatı göstermek içindir ve tamamen değiştirilebilir.
- Sonuçları eşleştiren çıktıları da Çıktılar kutusuna satır satır girin — iki liste aynı sayıda satır içeriyorsa değilse, araç çubuk çize tıklandığında hata gösterir.
- "Çubuk Çiz" butonuna tıklayarak Math.random() fonksiyonunun yeni bir döngüsünü çalıştırın ve kanvas üzerinde yeni bir çubuk seti gösterin — her tıklama önceki tıklamadan bağımsızdır.
- Merdivenin üstünde yer alan herhangi bir oyuncunun isim çipini tıklayarak, o oyuncunun yolu vurgulanan renk ile yukarıdan aşağıya animasyonla gösterilir ve eşleşen sonucu da altında gösterilir.
- Bir isim birer birer göstermek yerine, "Tümünü Göster" butonuna tıklayarak tüm oyuncu-sonuç eşleşmelerini aynı merdiven üzerinde bir kez gösterebilirsiniz.
SSS
- Merdiven gerçekten rastgele ve tahmin edilemez bir sayı üretici kullanıyor mu?
- Tarayıcının yerleşik Math.random() fonksiyonunu kullanır, kriptografik olarak güvenli crypto.getRandomValues() kullanmaz. Bu, yemek yapacak kimin belirlenmesi gibi işler için tamamen yeterlidir, ancak Math.random() iç durumu, yeterince önceki çıktıyı gözlemleyen birisi tarafından teorik olarak tahmin edilebilir. Bu aracı — ya da Math.random() temelli herhangi bir merdiveni — gerçek para, yasal ağırlığı olan ödüllerle ilgili raffle'lerde ya da bir katılımcının çekilişi tersine çevirmek için bir nedeni olan herhangi bir durumda kullanmayın.
- Sonuç eşlemesi gerçekten bir-tek-bir mi, yoksa iki oyuncunun aynı ödül alması mı mümkün?
- Bir-tek-bir eşleme yapısı ile garanti altına alınmıştır, şans değil. Her çubuk sadece iki komşu çizgiyi değiştirir ve kod aynı satırda iki çakışan çubuk yerleştirmeyi açıkça reddeder. Bu, merdivenin her satırını kendi başına küçük ve çakışmayan bir karıştırma yapısına dönüştürür. On iki tane bu karıştırmanın üst üste yerleştirilmesi, iki başlangıç çizgisinin aynı bitiş çizgisine yönlendirilmesini asla sağlayamaz — bu atama, rastgele atamalar ne şekilde olursa olsun, matematiksel bir birebir eşleme olur.
- Çok fazla oyuncu eklediğimde merdiven hâlâ adil mi?
- Bu, açıkça belirtilmiş sınırlamadır: merdiven her zaman sabit 12 satır kullanır, oyuncu sayısına bakılmaksızın. Bu araç 3 ila 10 oyuncu için inşa edilmiştir, bu yüzden 12 satır yeterli sayıda çakışmayı sağlar ve adil bir karıştırma hissi verir. Ancak 30 ya da 50 isim girdiğinizde, 12 satır o kadar çok sayıda olası eşleşmeyi eşit olasılıklarla dağıtmak için yeterli değildir — oyuncular genellikle başlangıç pozisyonlarına daha yakın kalır, bu da gerçekten eşit bir karıştırma ile karşılaştırıldığında daha az olasılıkla gerçekleşir. Büyük bir gruba ihtiyaç varsa, 12 satırın üstüne çıkamayan bir merdiven yerine, düz rastgele atama aracı daha iyi bir seçimdir.
- Bitmiş merdiveni kaydedebilir ya da paylaşabilir miyim?
- Araç üzerinden değil — bu sürümde "Kaydet", "İndir" ya da "Paylaş" butonu yoktur. Merdiven sadece sayfa açıkken kanvas elementindeki pikseller olarak mevcuttur. Sonucun bir kanıtı istiyorsanız (klasik "ekran görüntüsüyle anlaşmayı bitir" senaryosu), sayfayı yeniden yüklediğinizden önce tarayıcınızın ya da cihazınızın kendi ekran görüntüsü özelliğini kullanın — sayfa yenilendiğinde kanvas ve iki metin kutusu örnek verilerle yeniden başlatılır.
- Bu araç herhangi bir şeyi yükler mi ve internete ihtiyaç duyar mı?
- Hiçbir şey yüklenmez ve evet, internete ihtiyaç duymaz. Çubuk yerleştirme, kanvas çizimi ve yol izleme işlemleri, tarayıcınızın JavaScript motorunda, sıfır ağ isteği yapmadan çalışır. Bu nedenle, sayfa yüklendikten sonra internete bağlanmadan da araç çalışmaya devam eder ve yazdığınız isimler ve sonuçlar cihazınızdan asla çıkmaz.
- Bu araç, verilerimi yükler mi?
- Hayır. Her şey tarayıcınızda çalışır, bu yüzden verileriniz cihazınızdan asla çıkmaz — sayfa yüklendikten sonra bile çevrimdışı çalışır.