Python rasgele karıştırma nasıl çalışır?


11

Python'da rastgele çalışmalardan nasıl karıştırılır?

Soruyorum çünkü çok hızlı çalışıyor. Karıştırmaya çalıştığımda 10 ^ 6 öğesi için 1 dakika çalışıyor, ancak Python shuffle bunu 8 saniyede yapıyor mu?


14
Neden sadece kaynak koduna bakmıyorsunuz ?
tembellik

4
En iyi shuffle algoritması fisher-yates shuffle, O (n) zamanında çalışır ve mükemmel bir shuffle olduğu kanıtlanmıştır (iyi rastgele kaynak varsayarak)
cırcır ucube

1
@ratchetfreak: Python Fisher-Yates kullanıyor.
Martijn Pieters

1
Karıştırma için algoritmanız nedir?
whatsisname

@sloth, bu arada, Raymond Hettinger 2011 yılında kaynak koduna geri dönen evrensel bir doküman uygulaması önerdi .
Cristian Ciupitu

Yanıtlar:


17

Python en random.shuffle , O (n) sürede çalışan ve mükemmel bir karıştırma olduğu kanıtlanan Fisher-Yates shuffle'ı kullanır (iyi bir rasgele sayı üreteci olduğu varsayılarak).

Diziyi sondan ilk girişe kadar yineleyerek, her girdiyi altındaki rastgele bir dizindeki bir girişle değiştirir.

Fisher-Yates karıştırma işleminin temel işlemi, bir şapkadan veya kart destesinden kartlar arasından rastgele kartlar toplamaya benzer. Spesifik algoritmanın sağladığı, bunu sayısal olarak verimli ve titiz bir şekilde yapmanın, düzgün bir şekilde yapıldığında tarafsız bir sonucu garanti etmenin bir yoludur ...

Modern ... çözümü, "yinelenen" sayıları her yinelemede son vurulmamış sayı ile değiştirerek listenin sonuna taşımaktır. Bu O (n göre, O (n) için algoritmanın zaman karmaşıklığını azaltır 2 saf uygulanması için). Bu değişiklik aşağıdaki algoritmayı verir (sıfır tabanlı bir dizi için).

To shuffle an array a of n elements (indices 0..n-1):
  for i from n  1 downto 1 do
       j  random integer with 0  j  i
       exchange a[j] and a[i]
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.