Şu anda Sedgewick'in Coursera (Java'da öğretilen) algoritmaları dersini alıyorum. Tekdüze rastgele bir karıştırma algoritması oluşturduğunu söylüyor, dizideki her bir indeksi i
geçmem gerekiyor, bu öğeyi rastgele bir öğe ile değiştiriyorum. Öğeyi tüm diziden rastgele bir öğe ile değiştirecek olursam, tekdüze rastgele olmaz. Neden olmasın? Eğer her yineleme elemanı için [I], kendi içinde dahil olmak üzere, dizideki bir başka eleman ile tamamen rasgele olarak değiştirilirse, 1/N'den her zaman elemanın [I] nerede biteceğinin olasılığıdır; Yanlılığın nasıl ortaya çıktığını göremiyorum.Shuffle: Neden bir döngü arr [i] arr [r] (r: rasgele 0 - uzunluk - 1) ile eşit rastgele bir karışıklık değil mi?
Başka bir deyişle o savunmaktadır:
for (var i = 0; i < arr.length; i++){
var r = Math.floor(Math.random() * i + 1)
swap(r, i);
}
JavaScript Mazeret
for (var i = 0; i < arr.length; i++){
var r = Math.floor(Math.random() * arr.length)
swap(r, i);
}
üzerinde Yepyeni bir programcı değilim ve onunla daha rahat olduğum gibi :)
Önyargı, 0… i 'zaten başka bir yerde değiştirilmiş öğelerden geliyor. Her bir taksona kendi başına bakmak yerine, önceki iterasyonların tüm iterasyonlardan sonra olasılıkları hesaplamak için ne yaptığını hesaba katmanız gerekir. – Bergi
Çok güzel bir açıklama için [this] (http://blog.codinghorror.com/the-danger-of-naivete/) adresini okuyun. – pjs
Verimlilik önemli bir sorun değilse, tekdüze bir şekilde karıştırmanın bir yolu, kapma öğelerini rastgele bir şekilde tutmak ve bunları yalnızca daha önce kopyalanmamışlarsa yeni bir listeye kopyalamaktır. –