Dizideki öğeleri rasgele düzenleyen (rastgele yeniden sıralayan) bir fonksiyon yazalım.
Yazacağımız fonksiyon ile birden fazla çalışma farklı şekilde elemanların sıralanmasını sağlar.
Yazacağımız karıştırma kodu aşağıdaki gibi olacaktır.
1 2 3 4 5 | function karistir(dizi) { dizi.sort(() => Math.random() - 0.5); } |
Kodun çalışmasını biraz açıklayalım.
Bu işlem kısmen de olsa işe yaramaktadır, çünkü Math.random () – 0.5 pozitif veya negatif olabilen rastgele bir sayıdır, bu nedenle sıralama işlevi elemanları rastgele yeniden sıralar.
Ancak, sıralama işlevi bu şekilde kullanılmadığı için, tüm permütasyonlar aynı olasılıkta değildir.
Yukarıdaki algoritma yerine aşağıdaki şu algoritmayı kullanmak çok daha iyi sonuç vermektedir.
Örneğin, Fisher-Yates karışık çalma adlı harika bir algoritma var. Buradaki düşünce diziyi ters sırayla yürümek ve her öğeyi kendisinden önce rastgele bir tane ile değiştirmek:
1 2 3 4 5 6 7 8 9 | function karistir(dizi) { for (let i = dizi.length - 1; i > 0; i--) { let j = Math.floor(Math.random() * (i + 1)); [dizi[i], dizi[j]] = [dizi[j], dizi[i]]; } } |
yada daha basit(anlaşılır) şekilde yapmak için şunu kullanabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function karistir(arra1) { var ctr = arra1.length, temp, index; while (ctr > 0) { index = Math.floor(Math.random() * ctr); ctr--; temp = arra1[ctr]; arra1[ctr] = arra1[index]; arra1[index] = temp; } return arra1; } |
Yukarıdaki her iki yöntemi kullanmak için aşağıdaki gibi bir kodu yazmak yeterli olacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 | <script> //burada yukarıdaki fonksyionlardan biri yazılabilir. let dizi = [1, 2, 3,4,5,6,7,8,9,10]; karistir(dizi); alert(dizi); </script> |
Şimdi iyi görünüyor: tüm permütasyonlar aynı olasılıkta gözüküyor.
Ayrıca, performans açısından Fisher-Yates algoritması çok daha iyidir.
Yorum Yap