Bu Araç Nedir?
Bir liste rastgele sıralayıcı, bir öğe kümesini rastgele bir sıraya göre yeniden düzenler veya bu kümeden rastgele bir alt küme seçer. İşin zor kısmı, bunu önyargısız bir şekilde yapmaktır: Bir diziyi rastgele bir karşılaştırma fonksiyonuyla sıralamak gibi basit bir yaklaşım, bazı sıralamaların diğerlerine göre çok daha olası olduğu çarpık bir dağılım ortaya çıkarır.
Bu araç, kanıtlanabilir şekilde tekdüze bir rastgele permütasyon elde etmek için standart yöntem olan Fisher–Yates (Durstenfeld) karıştırma algoritmasını kullanır; listenizin her türlü olası sıralaması eşit olasılıkla ortaya çıkar.
Neden Kullanmalısınız?
- Gerçek anlamda tarafsız karıştırma — Fisher–Yates yöntemi; sonuçları çarpıtan yaygın (() => Math.random() - 0.5) anti-desen değil.
- Kazanan seçme modu: Listenin tamamını karıştırmak yerine tam olarak N adet rastgele öğe seçer; çekilişler ve hediye dağıtımları için idealdir.
- Yanlışlıkla tekrarlar içerebilecek listeler için, karıştırma işleminden önce isteğe bağlı olarak tekrarların kaldırılması.
- Her türlü metinle çalışır — isimler, görevler, biletler, ödüller — her satıra bir öğe.
- Özel: Karıştırma işlemi tamamen tarayıcınızda gerçekleşir, hiçbir şey yüklenmez.
Nasıl Kullanılır
- Listenizi kutuya yapıştırın; her satıra bir öğe yazın.
- Listede tekrarlar olabileceği durumlarda, isterseniz "karıştırmadan önce yinelenenleri kaldır" seçeneğini işaretleyin.
- Tüm sıralamayı yeniden düzenlemek için “Karıştır” düğmesine tıklamanız yeterlidir. Kazananları seçmek için “N öğe” seçeneğini işaretleyin ve kaç tane çekileceğini belirleyin.
- Sonucu kopyalayın — istediğiniz zaman tekrar “Karıştır” düğmesine tıklayarak yeni bir rastgele sıra veya yeni bir çekiliş elde edebilirsiniz.
Örnek
Giriş
Alice
Bob
Charlie
Diana
EthanÇıkış
A randomly reordered list such as Charlie, Ethan, Alice, Diana, Bob — different every time you click Shuffle.Kazanan seçme modu 2 olarak ayarlandığında, aynı girdi yerine sadece Ethan ve Alice sonuçlarını verebilir — bu, karıştırılmış bir sıralamadan alınan 2 öğelik bir dilim değil, rastgele seçilmiş 2 öğedir.
Neden basit bir karıştırma işlemi önyargılı sonuçlar ortaya çıkarır?
sort(() => Math.random() - 0.5), doğru gibi görünen ancak aslında doğru olmayan yaygın bir hiledir: Bu yöntem, sıralama algoritmasının karşılaştırıcıyı belirli bir düzende belirli sayıda çağırmasına dayanır; ancak gerçek hayattaki sıralama uygulamaları bunu garanti etmez. Bunun pratikteki etkisi, belirli sıralamaların diğerlerine göre daha sık ortaya çıktığı bir karıştırma işlemidir — bu fark, ilk bakışta fark edilmeyecek kadar ince olsa da, birçok deneme üzerinde istatistiksel olarak ölçülebilir.
Fisher–Yates, bu sorunun tamamını atlatır: bir sıralama algoritmasından dolaylı olarak rastgelelik üretmesini istemek yerine, her bir pozisyonu kalan rastgele bir pozisyonla tam olarak bir kez değiştirir; bu işlemin, altta yatan dilin sıralama uygulamasından bağımsız olarak kanıtlanabilir şekilde tekdüze olduğu gösterilmiştir.
Sıkça Sorulan Sorular
Neden sadece array.sort(() => Math.random() - 0.5) kullanmıyoruz?
Bu tek satırlık kod, iyi bilinen bir anti-desenidir: JavaScript’in sort() işlevi, her eleman çiftinin aynı sayıda karşılaştırılacağını garanti etmez; dolayısıyla ortaya çıkan sıralama, belirli permütasyonlara doğru ölçülebilir bir şekilde sapma gösterir — bazı öğeler, gerçek rastgelelikle elde edilecek sonuca kıyasla başlangıca veya sona daha yakın bir konumda yer alma olasılığı daha yüksektir. Fisher–Yates, yapısı gereği bunu tamamen önler ve bu araçta aslında uygulanan algoritma budur.
Karıştırma sırası gerçekten tarafsız mı?
Evet. Fisher–Yates algoritması listeyi bir kez tarar ve her adımda mevcut öğeyi, karıştırılmamış kalan kısımdan seçilen düzgün dağılımlı rastgele bir öğeyle değiştirir. İyi bir rastgelelik kaynağı (JavaScript’in Math.random() işlevi) kullanıldığında, bu yöntemin tüm olası sıralamaları eşit olasılıkla ürettiği matematiksel olarak kanıtlanmıştır.
Karıştırma modu ile kazanan seçme modu arasındaki fark nedir?
Karıştırma modu, listenizdeki her öğeyi yeniden sıralar ve hepsini yeni bir sırayla gösterir. Kazanan seçme modu ise rastgele yalnızca N öğeyi seçer ve sadece bunları gösterir; bu özellik, yeniden sıralanmış listenin tamamını ortaya çıkarmadan sabit sayıda kazanan veya örnek seçmek istediğinizde kullanışlıdır.
Bunu gerçek bir ödül çekilişi veya kura çekilişi için kullanabilir miyim?
Evet, gayri resmi hediye dağıtımları ve çekilişler için bu yöntem iyi sonuç verir, çünkü rastgelelik gerçekten eşit dağılımlıdır. Parasal ödüllü, yasal düzenlemelere tabi çekilişler için yerel mevzuatı kontrol edin — bazı yargı bölgelerinde denetlenebilir belirli bir çekiliş süreci zorunludur.
Yinelenenleri kaldırmak, orijinal listemi değiştirir mi?
Hayır — tekilleştirme yalnızca karıştırılmış çıktıya etki eder ve bu da yalnızca ilgili onay kutusu işaretlendiğinde gerçekleşir. Girdi listeniz tam olarak yazdığınız haliyle kalır; bu sayede, hiçbir şeyi yeniden yazmanıza gerek kalmadan bu seçeneği etkinleştirip devre dışı bırakabilir ve listeyi yeniden karıştırabilirsiniz.