Bir JavaScript dizisi nasıl rastgele hale getirilir (karıştırılır)?
Şöyle bir dizim var:
var arr1 = ["a", "b", "c", "d"];
Bunu nasıl rastgele hale getirebilir / karıştırabilirim?
1132
3
Şöyle bir dizim var:
var arr1 = ["a", "b", "c", "d"];
Bunu nasıl rastgele hale getirebilir / karıştırabilirim?
Fiili tarafsız karıştırma algoritması Fisher-Yates (Knuth olarak da bilinir) Shuffle'dır.
Bkz. https://github.com/coolaj86/knuth-shuffle
Burada harika bir görselleştirme (ve bununla bağlantılı orijinal gönderiyi) görebilirsiniz
Kullanılan algoritma hakkında biraz daha bilgi.
Fisher-Yates'in bilgisayar için optimize edilmiş bir versiyonu olan [Durstenfeld shuffle]'ın (http://en.wikipedia.org/wiki/Fisher-Yates_shuffle#The_modern_algorithm) JavaScript uygulaması:
Fisher-Yates algoritması, her orijinal dizi elemanı için bir rastgele eleman seçerek ve ardından bir sonraki çekilişten hariç tutarak çalışır. Tıpkı bir deste karttan rastgele seçim yapmak gibi.
Bu dışlama akıllıca bir yolla (Durstenfeld tarafından bilgisayarlar tarafından kullanılmak üzere icat edilmiştir), seçilen elemanı mevcut elemanla değiştirerek ve ardından kalandan bir sonraki rastgele elemanı seçerek yapılır. Optimum verimlilik için, döngü geriye doğru çalışır, böylece rastgele seçim basitleştirilir (her zaman 0'dan başlayabilir) ve artık başka seçenek olmadığı için son öğeyi atlar.
Bu algoritmanın çalışma süresi O(n)'dir. Karıştırma işleminin yerinde yapıldığına dikkat edin. Bu nedenle, orijinal diziyi değiştirmek istemiyorsanız, önce
.slice(0)
ile bir kopyasını oluşturun.ES6 / ECMAScript 2015'e Güncelleme
Yeni ES6 aynı anda iki değişken atamamıza izin veriyor. Bu, özellikle iki değişkenin değerlerini değiştirmek istediğimizde kullanışlıdır, çünkü bunu tek bir kod satırında yapabiliriz. İşte aynı fonksiyonun bu özelliği kullanan daha kısa bir biçimi.
Biri bunu Array'den bir protoype olarak kullanabilir (veya kullanmalıdır):
ChristopheD'den: