SORU
7 HAZİRAN 2009, Pazar


JavaScript Dizi kullanmak doğru mu.() tür karıştırma için yöntem?

JavaScript kodu ile birine yardım ediyordum ve gözlerim böyle görünen bir bölüm tarafından yakalandı:

function randOrd(){
  return (Math.round(Math.random())-0.5);
}
coords.sort(randOrd);
alert(coords);

Benim ilk olsa idi:hey, bu işe yaramayacak!Ama o zaman ve gerçekten de en azından güzel rastgele sonuçlar sağlamak gibi görünüyor buldum deneme yaptım.

Sonra biraz web araştırması yaptım ve hemen üstüne bu kodu en ceartanly kopyalandı article bir buldu. Oldukça saygın bir site gibi görünüyordu ve yazar...

Ama benim hislerime bu yanlış olması gerektiğini söyledi. Özellikle sıralama algoritması ECMA standart tarafından belirtilen değil gibi. Farklı sıralama algoritms düzgün olmayan farklı değişikliğinin neden olacağını düşünüyorum. Bazı sıralama algoritmaları muhtemelen sonsuz döngüye bile olabilir...

Ama sen ne düşünüyorsun?

Ve başka bir soru... şimdi nasıl gidip nasıl bu rastgele karıştırma tekniği sonuçları ölçmek istiyorsunuz?

güncelleme:Bazı Ölçümler yaptım ve sonuçlar aşağıda cevap olarak gönderildi.

CEVAP
7 HAZİRAN 2009, Pazar


Jon zaten covered the theory, sonra burada bir uygulama

function shuffle(array) {
    var tmp, current, top = array.length;

    if(top) while(--top) {
    	current = Math.floor(Math.random() * (top   1));
    	tmp = array[current];
    	array[current] = array[top];
    	array[top] = tmp;
    }

    return array;
}

Algoritma O(n log n) olmalı sıralama ise O(n). sort() yerel işleve göre JS kodu yürütme yükü bağlı olarak, bu dizi boyutları ile arttıracak noticable difference in performance yol açabilir.

< / ^ hr .

bobobobo's answer, yorum, söz konusu algoritma dengeli dağılmış olasılıkları (sort() uygulamaya bağlı olarak) üretmek olmayabilir bir durum söz konusu.

Bu doğrultuda gidiyor benim iddiam: belirli sayıda gerektirir Bir sıralama algoritması Kabarcık için karşılaştırma, eg c c = n(n-1)/2. Rastgele bizim karşılaştırma işlevi, her karşılaştırma sonucu 2^c vardır eşit derecede Olası, yani yaparaynı derecede muhtemelsonuçları. Şimdi, her sonuç genel durumda bile bir dağıtım mümkün kılan dizisinin girişleri n! permütasyon, bir karşılık vardır. (Bu bir basitleştirme olduğunu karşılaştırmalar neeeded sayısını giriş dizisine bağlı olarak, ama iddia hala tutmak gerekir.)

Jon işaret etti, Bu tek başına hiçbir neden tercih Fisher-Yates üzerinde kullanarak sort() olarak rastgele sayı üreteci de bir harita sonlu sayıda rasgele değerleri n! permütasyon. Ama Fisher-Yates sonuçlarının daha iyi olması gerekir:

Math.random() aralığında rasgele bir sayı [0;1[ üretir. JS kullanır çift duyarlıklı kayan nokta değerleri olarak, bu 52 ≤ x ≤ 63 * * * * 2^x olası değerler için (gerçek sayı bulmak için çok tembelim) karşılık gelir. Olasılık dağılımı Math.random() kullanılarak oluşturulan atom olay sayısı büyüklükte aynı sırada ise iyi davranmayı kes.

Fisher-Yates kullanırken, ilgili parametre hiçbir zaman pratik sınırlamalar nedeniyle 2^52 yaklaşmalıdır dizisi, boyutudur.

Rastgele bir karşılaştırma işlevi ile sıralama işlevi temelde dönüş değeri pozitif veya negatif, bu asla bir sorun olacak bu yüzden eğer sadece umurunda. Karşılaştırma işlevi belirtilen, eşit derecede muhtemel olarak iyi yetişmiş, 2^c olası sonuçları vardır. ama buna benzer bir tane daha var: c ~ n log n 2^c ~ n^(a·n) a = const, hangi yapar en azından mümkün 2^c aynı büyüklükte (hatta daha az) n! ve böylece önde gelen bir dengesiz dağılımı, bile sıralama algoritması nerede için haritanın üzerine permutaions eşit. Eğer bu varsa herhangi bir pratik etkisi beni aşar.

Asıl sorun sıralama algoritmaları permütasyon eşit olarak üzerine harita garanti edilmez. Kolay Mergesort simetrik olarak yok olduğunu görmek, ama Kabarcık gibi bir şey ya da, daha da önemlisi akıl, Quicksort veya yığın sıralaması değildir.

< / ^ hr .

Alt satırında: sort() kullandığı sürece, Mergesortgerekirköşe durumlarda (en az 2^c ≤ n! köşe bir durum olduğunu umuyorum), aksi takdirde tüm bahisler kapalı hariç oldukça güvenli olması.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • celebrateubuntu

    celebrateubu

    23 Mayıs 2011
  • EvilControllers

    EvilControll

    20 Ocak 2008
  • Michael Neal

    Michael Neal

    2 Mayıs 2009