Karıştırma için JavaScript Array.sort () yöntemini kullanmak doğru mu?


126

Birisine JavaScript kodu ile yardım ediyordum ve şuna benzer bir bölüm gözlerimi yakaladı:

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

İlki şuydu: hey, bu muhtemelen işe yaramaz! Ama sonra biraz deney yaptım ve gerçekten de en azından güzel bir şekilde randomize sonuçlar veriyor gibi göründüğünü keşfettim.

Sonra biraz web araması yaptım ve neredeyse en üstte bu kodun en çok cürufla kopyalandığı bir makale buldum . Oldukça saygın bir site ve yazara benziyordu ...

Ama içimden gelen hisler bana bunun yanlış olması gerektiğini söylüyor. Özellikle sıralama algoritması ECMA standardı tarafından belirtilmediğinden. Bence farklı sıralama algoritmaları, farklı tek tip olmayan karıştırmalara neden olacaktır. Bazı sıralama algoritmaları muhtemelen sonsuz döngüye bile girebilir ...

Ama ne düşünüyorsun?

Ve başka bir soru olarak ... şimdi nasıl gidip bu karıştırma tekniğinin sonuçlarının ne kadar rastgele olduğunu ölçebilirim?

güncelleme: Bazı ölçümler yaptım ve aşağıdaki sonuçları cevaplardan biri olarak gönderdim.


sadece sonucu yuvarlamanın faydasız olduğunu fark etmek için sadece işaret sayımı
bormat

2
" Güzel rasgele sonuçlar veriyor gibi göründüğünü gördüm. " - GERÇEKTEN ???
Bergi

Yanıtlar:


109

Kısmen sizin de söylediğiniz gibi uygulamaya özgü olduğu için , bu benim en sevdiğim karıştırma yöntemi olmadı . Özellikle, Java veya .NET'ten standart kitaplık sıralamanın (hangisi olduğundan emin değilim), bazı öğeler arasında tutarsız bir karşılaştırmayla sonuçlanıp sonuçlanmadığını tespit edebileceğini hatırlıyorum (örneğin , önce A < Bve B < Csonra C < A).

Ayrıca, gerçekten ihtiyacınız olandan daha karmaşık (yürütme süresi açısından) bir karıştırma olarak sonuçlanır.

Koleksiyonu etkin bir şekilde "karıştırılmış" (koleksiyonun başında, başlangıçta boş) ve "karıştırılmamış" (koleksiyonun geri kalanı) olarak bölümlere ayıran karıştırma algoritmasını tercih ederim. Algoritmanın her adımında, rastgele karıştırılmamış bir öğe seçin (ilki olabilir) ve bunu ilk karıştırılmamış öğe ile değiştirin - sonra onu karıştırılmış olarak ele alın (yani, dahil etmek için bölümü zihinsel olarak hareket ettirin).

Bu O (n) ve sadece rasgele sayı üretecine n-1 çağrıları gerektiriyor ki bu güzel. Aynı zamanda gerçek bir karıştırma üretir - herhangi bir öğenin, orijinal konumuna bakılmaksızın (makul bir RNG varsayılarak) her boşlukta bitme şansı 1 / n'dir. Sıralanmış sürüm yaklaşık olarak eşit bir dağılıma denk gelir (rastgele sayı oluşturucunun aynı değeri iki kez seçmediğini varsayarsak, bu rastgele çiftler döndürüyorsa bu pek olası değildir) ancak karışık sürüm hakkında mantık yürütmeyi daha kolay buluyorum :)

Bu yaklaşıma Fisher-Yates karıştırması denir .

Bu karıştırmayı bir kez kodlamayı ve öğeleri karıştırmak için ihtiyaç duyduğunuz her yerde yeniden kullanmayı en iyi uygulama olarak kabul ediyorum. O zaman uygulamaları güvenilirlik veya karmaşıklık açısından sıralama konusunda endişelenmenize gerek kalmaz. Sadece birkaç satırlık kod (JavaScript'te denemeyeceğim!)

Karıştırma üzerine Wikipedia makalesi kaçınmak gerektiğini bilmeleri 's değerinde, genel olarak karıştırılması için kötü uygulamaları bölümüne okuma - rastgele projeksiyon sıralama hakkında görüşmeler (ve özellikle karışık algoritmalar bölümünde).


5
Raymond Chen, sıralama karşılaştırma işlevlerinin kurallara uymasının
Jason Kresowaty

1
benim gerekçem doğruysa, sıralı versiyonu değil 'gerçek' bir karıştır üretmek!
Christoph

@Christoph: Bunu düşünürsek, Fisher-Yates bile rand (x) aralığının tam olarak eşit olması garanti edilirse "mükemmel" bir dağılım sağlayacaktır . Bazı x'ler için RNG için genellikle 2 ^ x olası durum olduğu göz önüne alındığında, bunun rand (3) için tam olarak eşit olacağını düşünmüyorum .
Jon Skeet

@Jon: ancak Fisher-Yates 2^xher dizi indeksi için durum oluşturacak , yani toplamda 2 ^ (xn) durum olacak, bu 2 ^ c'den biraz daha büyük olmalı - ayrıntılar için düzenlenmiş cevabıma bakın
Christoph

@Christoph: Kendimi doğru bir şekilde açıklamamış olabilirim. Yalnızca 3 öğeniz olduğunu varsayalım. İlk elemanı rastgele seçersiniz, her şeyden 3. Tamamen tek tip bir dağılım elde etmek için, tamamen tek tip olarak [0,3) aralığında rastgele bir sayı seçebilmeniz gerekir - ve eğer PRNG'de 2 ^ n varsa olası durumlar, bunu yapamazsınız - olasılıklardan bir veya ikisinin meydana gelme olasılığı biraz daha yüksek olacaktır .
Jon Skeet

118

Jon teoriyi zaten ele aldıktan sonra , işte 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)sıralama ise olmalıdır O(n log n). Yerel sort()işleve kıyasla JS kodunu yürütmenin ek yüküne bağlı olarak , bu , dizi boyutlarıyla artması gereken performansta gözle görülür bir farka yol açabilir .


Bobobobo'nun cevabına yapılan yorumlarda , söz konusu algoritmanın eşit dağıtılmış olasılıklar üretmeyebileceğini (uygulamasına bağlı olarak sort()) belirttim.

Benim argümanım şu satırlarda devam ediyor: Bir sıralama algoritması belirli sayıda ckarşılaştırma gerektirir , örneğin c = n(n-1)/2Bubblesort için. Rastgele karşılaştırma fonksiyonumuz, her bir karşılaştırmanın sonucunu eşit derecede olası kılar, yani 2^c eşit derecede olası sonuçlar vardır. Şimdi, her sonucun n!dizi girdilerinin permütasyonlarından birine karşılık gelmesi gerekir , bu da genel durumda eşit dağılımı imkansız kılar. (Bu bir basitleştirmedir, çünkü gereken gerçek karşılaştırma sayısı giriş dizisine bağlıdır, ancak iddia yine de geçerli olmalıdır.)

Jon'un belirttiği gibi, bu tek başına Fisher-Yates'i kullanmak yerine tercih etmek için bir neden değildir sort(), çünkü rasgele sayı üreteci n!permütasyonlara sonlu sayıda sözde rasgele değeri de eşleyecektir. Ancak Fisher-Yates'in sonuçları yine de daha iyi olacaktır:

Math.random()aralıkta sözde rasgele bir sayı üretir [0;1[. JS çift duyarlıklı kayan nokta değerleri kullandığından, bu 2^xolası değerlere karşılık gelir 52 ≤ x ≤ 63(gerçek sayıyı bulmak için çok tembelim). Kullanılarak oluşturulan bir olasılık dağılımı Math.random(), atomik olayların sayısı aynı büyüklük sırasındaysa iyi davranmayı durduracaktır.

Fisher-Yates kullanırken, ilgili parametre, 2^52pratik sınırlamalar nedeniyle asla yaklaşmaması gereken dizinin boyutudur .

Rastgele bir karşılaştırma işleviyle sıralama yaparken, işlev temelde yalnızca dönüş değerinin pozitif mi yoksa negatif mi olduğunu dikkate alır, bu nedenle bu asla bir sorun olmayacaktır. Ancak benzer bir tane var: Karşılaştırma işlevi iyi davrandığından, 2^colası sonuçlar, belirtildiği gibi eşit derecede olasıdır. Eğer c ~ n log no zaman 2^c ~ n^(a·n)nerede ise a = const, bu en azından mümkün kılar, bu 2^caynı büyüklüktedir (veya daha azdır) n!ve böylece eşit olmayan bir dağılıma yol açar, sıralama algoritması permütasyonların nerede eşit olarak eşleneceği olsa bile. Bunun pratik bir etkisi varsa beni aşıyor.

Gerçek sorun, sıralama algoritmalarının permütasyonlarla eşit şekilde eşlenmesinin garanti edilmemesidir. Mergesort'un simetrik olduğunu görmek kolaydır, ancak Bubblesort veya daha da önemlisi Quicksort veya Heapsort gibi bir şey hakkında mantık yürütmek öyle değildir.


Sonuç olarak: sort()Mergesort kullanıldığı sürece, köşe vakaları dışında makul derecede güvende olmalısınız (en azından 2^c ≤ n!bunun bir köşe vakası olduğunu umuyorum ), değilse, tüm bahisler kapalıdır.


Uygulama için teşekkürler. İnanılmaz derecede hızlı! Özellikle bu arada kendi başıma yazdığım yavaş saçmalıklarla karşılaştırıldığında.
Rene Saarsoo


Bunun için çok teşekkür ederim, sizin ve Johns cevabının kombinasyonu, benim ve bir iş arkadaşımın birlikte neredeyse 4 saat harcadığı bir sorunu çözmeme yardımcı oldu! Başlangıçta OP'ye benzer bir yönteme sahiptik, ancak randomizasyonun çok kesintili olduğunu bulduk, bu yüzden yönteminizi aldık ve biraz jquery ile çalışacak şekilde biraz değiştirdik (bir kaydırıcı için) bir görüntü listesi elde etmek için harika randomizasyon.
Merhaba Dünya

16

Bu rastgele sıralamanın sonuçlarının ne kadar rastgele olduğuna dair bazı ölçümler yaptım ...

Tekniğim, küçük bir dizi [1,2,3,4] alıp tüm (4! = 24) permütasyonlarını oluşturmaktı. Daha sonra, karma işlevini diziye çok sayıda uygular ve her permütasyonun kaç kez üretildiğini sayarım. İyi bir karıştırma algoritması, sonuçları tüm permütasyonlara oldukça eşit bir şekilde dağıtırken, kötü bir algoritma bu tek tip sonucu yaratmayacaktır.

Aşağıdaki kodu kullanarak Firefox, Opera, Chrome, IE6 / 7 / 8'de test ettim.

Şaşırtıcı bir şekilde, rastgele sıralama ve gerçek karıştırma, her ikisi de eşit derecede tek tip dağılımlar yarattı. Görünüşe göre (birçoklarının önerdiği gibi) ana tarayıcılar birleştirme sıralaması kullanıyor. Elbette bu, farklı bir şekilde çalışan bir tarayıcı olamayacağı anlamına gelmez, ancak bunun, bu rastgele sıralama yönteminin pratikte kullanılacak kadar güvenilir olduğu anlamına geldiğini söyleyebilirim.

DÜZENLEME: Bu test, rastgeleliği veya eksikliğini gerçekten doğru bir şekilde ölçmedi. Gönderdiğim diğer cevaba bakın.

Ancak performans tarafında, Cristoph tarafından verilen shuffle işlevi açık bir galipti. Küçük dört öğeli diziler için bile gerçek karıştırma, rastgele sıralamadan yaklaşık iki kat daha hızlı gerçekleştirildi!

// Cristoph tarafından yayınlanan karıştırma işlevi.
var shuffle = function (dizi) {
    var tmp, geçerli, üst = dizi.length;

    if (top) while (- top) {
        current = Math.floor (Math.random () * (üst + 1));
        tmp = dizi [geçerli];
        dizi [akım] = dizi [üst];
        dizi [üst] = tmp;
    }

    dönüş dizisi;
};

// rastgele sıralama işlevi
var rnd = function () {
  Dönüş Math.round (Math.random ()) - 0.5;
};
var randSort = function (A) {
  dönüş A. sıralama (rnd);
};

var permutations = function (A) {
  eğer (A. uzunluk == 1) {
    dönüş [A];
  }
  Başka {
    var perms = [];
    for (var i = 0; i <A. uzunluk; i ++) {
      var x = A. dilim (i, i + 1);
      var xs = A. dilim (0, i) .concat (A. dilim (i + 1));
      var altpermler = permütasyonlar (xs);
      for (var j = 0; j <altperms.length; j ++) {
        perms.push (x.concat (subperms [j]));
      }
    }
    iade izinleri;
  }
};

var test = function (A, yinelemeler, işlev) {
  // init permütasyonları
  var istatistikler = {};
  var perms = permütasyonlar (A);
  for (perms cinsinden i) {
    istatistikler ["" + perms [i]] = 0;
  }

  // birçok kez karıştırın ve istatistikleri toplayın
  var başlangıç ​​= yeni Tarih ();
  for (var i = 0; i <yinelemeler; i ++) {
    var karıştırılmış = func (A);
    istatistikler [ "" + Shuffled] ++;
  }
  var end = new Date ();

  // sonucu biçimlendir
  var arr = [];
  for (istatistiklerde var i) {
    arr.push (i + "" + istatistikler [i]);
  }
  return arr.join ("\ n") + "\ n \ nAlınan süre:" + ((bitiş - başlangıç) / 1000) + "saniye.";
};

alert ("rastgele sıralama:" + test ([1,2,3,4], 100000, randSort));
uyarı ("karıştır:" + test ([1,2,3,4], 100000, karıştır));

11

İlginç bir şekilde, Microsoft aynı tekniği rastgele seç-tarayıcı sayfalarında kullandı.

Biraz farklı bir karşılaştırma işlevi kullandılar:

function RandomSort(a,b) {
    return (0.5 - Math.random());
}

Bana neredeyse aynı görünüyor, ama o kadar da rastgele olmadığı ortaya çıktı ...

Bu yüzden bağlantılı makalede kullanılan aynı metodolojiyi kullanarak tekrar bazı test çalışmaları yaptım ve gerçekten de - rastgele sıralama yönteminin hatalı sonuçlar ürettiği ortaya çıktı. Yeni test kodu burada:

function shuffle(arr) {
  arr.sort(function(a,b) {
    return (0.5 - Math.random());
  });
}

function shuffle2(arr) {
  arr.sort(function(a,b) {
    return (Math.round(Math.random())-0.5);
  });
}

function shuffle3(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;
}

var counts = [
  [0,0,0,0,0],
  [0,0,0,0,0],
  [0,0,0,0,0],
  [0,0,0,0,0],
  [0,0,0,0,0]
];

var arr;
for (var i=0; i<100000; i++) {
  arr = [0,1,2,3,4];
  shuffle3(arr);
  arr.forEach(function(x, i){ counts[x][i]++;});
}

alert(counts.map(function(a){return a.join(", ");}).join("\n"));

Neden 0,5 olması gerektiğini anlamıyorum - Math.random (), neden sadece Math.random () olmasın?
Alexander Mills

1
@AlexanderMills: karşılaştırma fonksiyonu iletilen sort()büyük bir sayı geri gerekiyordu, daha az ya da karşılaştırılması bağlı olarak sıfıra eşit ave b. ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )
LarsH

@LarsH evet bu mantıklı
Alexander Mills

9

Web siteme, mevcut tarayıcınızın diğer popüler tarayıcılara karşı farklı karıştırma yöntemlerini kullanan önyargısını gösteren basit bir test sayfası yerleştirdim . Önyargılı olmayan Math.random()-0.5başka bir 'rastgele' karıştırmayı ve yukarıda bahsedilen Fisher-Yates yöntemini kullanmanın korkunç önyargısını gösterir .

Bazı tarayıcılarda, bazı öğelerin 'karıştırma' sırasında hiç yer değiştirmeme ihtimalinin% 50'ye kadar çıktığını görebilirsiniz!

Not: @Christoph tarafından Fisher-Yates karıştırmasının uygulanmasını, kodu şu şekilde değiştirerek Safari için biraz daha hızlı yapabilirsiniz:

function shuffle(array) {
  for (var tmp, cur, top=array.length; top--;){
    cur = (Math.random() * (top + 1)) << 0;
    tmp = array[cur]; array[cur] = array[top]; array[top] = tmp;
  }
  return array;
}

Test sonuçları: http://jsperf.com/optimized-fisher-yates


5

Dağıtım konusunda seçici olmadığınız ve kaynak kodunun küçük olmasını istediğiniz durumlarda sorun olmadığını düşünüyorum.

JavaScript'te (kaynağın sürekli olarak iletildiği yerde), küçük bant genişliği maliyetlerinde fark yaratır.


2
Şey, dağıtım konusunda neredeyse her zaman düşündüğünüzden daha meraklısınızdır ve "küçük kod" için, her zaman arr = arr.map(function(n){return [Math.random(),n]}).sort().map(function(n){return n[1]});, çok fazla uzun olmama ve gerçekten düzgün bir şekilde dağıtılma avantajına sahip olan vardır. Ayrıca çok sıkıştırılmış Knuth / FY shuffle varyantları da vardır.
Daniel Martin

@DanielMartin Bu tek satırlık bir cevap olmalı. Şuna benzer Ayrıca, öylesine ayrıştırma hataları önlemek için, iki noktalı virgül eklenmesi gereken: arr = arr.map(function(n){return [Math.random(),n];}).sort().map(function(n){return n[1];});.
Giacomo1968

2

Kesinlikle bir hack. Pratikte, sonsuz döngülü bir algoritma olası değildir. Nesneleri sıralıyorsanız, coords dizisinde dönüp şöyle bir şey yapabilirsiniz:

for (var i = 0; i < coords.length; i++)
    coords[i].sortValue = Math.random();

coords.sort(useSortValue)

function useSortValue(a, b)
{
  return a.sortValue - b.sortValue;
}

(ve sortValue'yu kaldırmak için tekrar döngü yapın)

Yine de bir hack. Güzelce yapmak istiyorsan zor yoldan yapmalısın :)


2

Dört yıl oldu, ancak hangi sıralama algoritmasını kullanırsanız kullanın, rastgele karşılaştırma yönteminin doğru şekilde dağıtılmayacağını belirtmek isterim.

Kanıt:

  1. Bir neleman dizisi için , tam olarak n!permütasyonlar (yani, olası karışıklıklar) vardır.
  2. Bir karıştırma sırasındaki her karşılaştırma, iki set permütasyon arasında bir seçimdir. Rastgele bir karşılaştırıcı için, her seti seçme şansı 1 / 2'dir.
  3. Bu nedenle, her permütasyon p için, permütasyon p ile bitme şansı, paydası 2 ^ k olan bir kesirdir (bir k için), çünkü bu tür kesirlerin toplamıdır (örneğin 1/8 + 1/16 = 3/16 ).
  4. N = 3 için, eşit olasılıkla altı permütasyon vardır. O halde her permütasyonun şansı 1 / 6'dır. 1/6, paydası 2 olan bir kesir olarak ifade edilemez.
  5. Bu nedenle, yazı tura ile sıralama hiçbir zaman adil bir karıştırma dağılımıyla sonuçlanmaz.

Doğru şekilde dağıtılabilecek boyutlar yalnızca n = 0,1,2'dir.


Alıştırma olarak, n = 3 için farklı sıralama algoritmalarının karar ağacını çıkarmayı deneyin.


İspatta bir boşluk var: Bir sıralama algoritması, karşılaştırıcının tutarlılığına bağlıysa ve tutarsız bir karşılaştırıcıyla sınırsız çalışma süresine sahipse, sonsuz bir olasılık toplamına sahip olabilir; toplamdaki her payda 2'nin gücüdür. Birini bulmaya çalışın.

Ayrıca, bir karşılaştırıcının herhangi bir yanıtı verme konusunda sabit bir şansı varsa (örneğin (Math.random() < P)*2 - 1, sabit için P), yukarıdaki ispat geçerlidir. Karşılaştırıcı bunun yerine oranlarını önceki cevaplara göre değiştirirse, adil sonuçlar elde etmek mümkün olabilir. Belirli bir sıralama algoritması için böyle bir karşılaştırıcı bulmak bir araştırma makalesi olabilir.


1

D3 kullanıyorsanız, yerleşik bir karıştırma işlevi vardır (Fisher-Yates kullanarak):

var days = ['Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi','Dimanche'];
d3.shuffle(days);

Ve işte Mike bununla ilgili ayrıntılara giriyor:

http://bost.ocks.org/mike/shuffle/


0

İşte tek bir dizi kullanan bir yaklaşım:

Temel mantık şudur:

  • N elemanlı bir dizi ile başlayarak
  • Diziden rastgele bir öğeyi kaldırın ve diziye aktarın
  • Dizinin ilk n - 1 öğesinden rastgele bir öğeyi çıkarın ve diziye aktarın
  • Dizinin ilk n - 2 öğesinden rastgele bir öğeyi çıkarın ve diziye aktarın
  • ...
  • Dizinin ilk öğesini kaldırın ve dizinin üzerine itin
  • Kod:

    for(i=a.length;i--;) a.push(a.splice(Math.floor(Math.random() * (i + 1)),1)[0]);

    Uygulamanız, önemli sayıda öğenin el değmemiş olmasına izin verme riski yüksektir. Sadece tüm dizide, en üste itilen alt öğelerin miktarı kadar kaydırılacaklar. Bu karışıklıkta onu güvenilmez kılan bir desen var.
    Kir Kanos

    @KirKanos, yorumunuzu anladığımdan emin değilim. Önerdiğim çözüm O (n). Kesinlikle her unsura "dokunacak". İşte gösterilecek bir keman .
    ic3b3rg

    0

    Array.sort()Bir diziyi karıştırmak için işlevi kullanabilir misiniz - Evet.

    Sonuçlar yeterince rastgele mi - Hayır.

    Aşağıdaki kod parçacığını düşünün:

    var array = ["a", "b", "c", "d", "e"];
    var stats = {};
    array.forEach(function(v) {
      stats[v] = Array(array.length).fill(0);
    });
    //stats = {
    //    a: [0, 0, 0, ...]
    //    b: [0, 0, 0, ...]
    //    c: [0, 0, 0, ...]
    //    ...
    //    ...
    //}
    var i, clone;
    for (i = 0; i < 100; i++) {
      clone = array.slice(0);
      clone.sort(function() {
        return Math.random() - 0.5;
      });
      clone.forEach(function(v, i) {
        stats[v][i]++;
      });
    }
    
    Object.keys(stats).forEach(function(v, i) {
      console.log(v + ": [" + stats[v].join(", ") + "]");
    })

    Örnek çıktı:

    a [29, 38, 20,  6,  7]
    b [29, 33, 22, 11,  5]
    c [17, 14, 32, 17, 20]
    d [16,  9, 17, 35, 23]
    e [ 9,  6,  9, 31, 45]

    İdeal olarak, sayımlar eşit olarak dağıtılmalıdır (yukarıdaki örnek için, tüm sayımlar yaklaşık 20 olmalıdır). Ama değiller. Görünüşe göre dağıtım, tarayıcı tarafından hangi sıralama algoritmasının uygulandığına ve sıralama için dizi öğelerini nasıl yinelediğine bağlıdır.

    Bu makalede daha fazla bilgi sağlanmıştır:
    Array.sort () bir diziyi karıştırmak için kullanılmamalıdır


    -3

    Bunda yanlış bir şey yok.

    .Sort () 'a geçtiğiniz işlev genellikle şuna benzer:

    function sortingFunc (birinci, ikinci)
    {
      // misal:
      ilk dönüş - ikinci;
    }
    

    SortingFunc'daki işiniz şunu döndürmektir:

    • ilki ikinciden önce gelirse negatif bir sayı
    • ilki ikinciden sonra gitmesi gerekiyorsa pozitif bir sayı
    • ve tamamen eşitlerse 0

    Yukarıdaki sıralama işlevi işleri sıraya koyar.

    Eğer sahip olduğunuz gibi rastgele-ve + 'lar döndürürseniz, rastgele bir sıralama elde edersiniz.

    MySQL'deki gibi:

    SEÇİN * tablodan SİPARİŞ VER
    

    5
    Orada olan şey yanlış bu yaklaşımla: JS uygulanması tarafından kullanılıyor sıralama algoritması bağlı olasılıklar eşit dağıtılacak olmayacak!
    Christoph

    Bu pratik olarak endişelendiğimiz bir şey mi?
    bobobobo

    4
    @bobobobo: uygulamaya bağlı olarak evet, bazen yapıyoruz; ayrıca, doğru çalışan bir shuffle()yalnızca bir kez yazılmalıdır, bu yüzden gerçekten bir sorun değildir: sadece pasajı kod kasanıza koyun ve ihtiyacınız olduğunda ortaya çıkarın
    Christoph
    Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
    Licensed under cc by-sa 3.0 with attribution required.