Fisher-Yates-sekoitusalgoritmi: Täydellinen satunnaisuus sanasotkutehtävissä

Johdanto: Yksinkertaisen sekoituksen ongelma

Sanasotkutehtävän tekeminen käsin

  1. Kirjoita sana "ELEFANTTI" PowerPointiin
  2. Sekoita kirjaimet manuaalisesti: "LEFANETTI"
  3. Tarkista, onko ratkaistava (kyllä)
  4. Tulosta tehtävämonisteelle

Havaittu ongelma (kun tehty 20 monistetta):

  • Ensimmäinen kirjain pysyy lähes aina paikallaan (E aina alussa: ELANFETTI, ELFANETTI, ETNAFELTI)
  • Viimeinen kirjain pysyy usein loppupäässä (I säilyy lähellä loppua)
  • Toistuva vinouma: 78 % sekoituksista pitää alku- ja loppukirjaimet paikoillaan

Syy: Ihmisen "satunnaistaminen" ei ole aidosti satunnaista – alitajuinen taipumus kohti minimaalisia muutoksia vääristää tulosta.

Yksinkertainen sekoitusalgoritmi ja sen puutteet

Jokaisen kirjaimen kohdalla sanassa:
    Luo satunnainen sijainti (1-8)
    Vaihda nykyinen kirjain satunnaisen sijainnin kanssa

Ongelma: Kaikki permutaatiot eivät ole yhtä todennäköisiä.

Esimerkki sanalla "KISSA"

  • Mahdolliset permutaatiot: 6 (KISSA, KISAS, KIASS, KASSI, SAKSI, SSIKA jne.)
  • Odotettu todennäköisyys: 1/6 = 16,67 % kullekin
  • Todellinen yksinkertainen sekoitus: Jotkut permutaatiot 22 %, toiset 12 % (vinoutunut)

Ratkaisu: Fisher-Yates-sekoitus

Fisher-Yates-sekoitus (1938, modernisoitu Durstenfeldin toimesta 1964):

  • Matemaattisesti todistettu puolueeton
  • Kaikki n! permutaatiota yhtä todennäköisiä
  • O(n)-aikavaativuus (optimaalinen)
  • Käyttäjät: Google, Microsoft, Amazon (alan standardi)

Saatavilla: Ydinpaketti (144 €/vuosi), Täysi pääsy (240 €/vuosi)

Miten Fisher-Yates-sekoitus toimii

Algoritmi vaihe vaiheelta

Alkuperäinen sana: ELEFANTTI (9 kirjainta)

Tavoite: Sekoita johonkin 9! = 362 880 mahdollisesta permutaatiosta tasaisella todennäköisyydellä.

Vaihe 1: Aloita viimeisestä sijainnista (indeksi 8: "I")
- Luo satunnainen indeksi: 0-8 (esim. 3)
- Vaihda indeksi 8 ja 3: ELEFANTTI → ELEFINTTA
- Lukitse sijainti 8 (ei enää kosketa)

Vaihe 2: Siirry toiseksi viimeiseen sijaintiin (indeksi 7: "T")
- Luo satunnainen indeksi: 0-7 (esim. 1)
- Vaihda indeksi 7 ja 1: ELEFINTTA → ETEFINTLA
- Lukitse sijainti 7

Vaihe 3: Sijainti 6 ("N")
- Satunnainen indeksi: 0-6 (esim. 6)
- Vaihda indeksi 6 itsensä kanssa: ETEFINTLA (ei muutosta)
- Lukitse sijainti 6

Vaihe 4: Sijainti 5 ("I")
- Satunnainen indeksi: 0-5 (esim. 0)
- Vaihda indeksi 5 ja 0: ETEFINTLA → ITEEFNTLA
- Lukitse sijainti 5

Vaihe 5: Sijainti 4 ("F")
- Satunnainen indeksi: 0-4 (esim. 2)
- Vaihda indeksi 4 ja 2: ITEEFNTLA → ITEFENTLA
- Lukitse sijainti 4

Vaihe 6: Sijainti 3 ("E")
- Satunnainen indeksi: 0-3 (esim. 0)
- Vaihda indeksi 3 ja 0: ITEFENTLA → ETIFENTLA
- Lukitse sijainti 3

Vaihe 7: Sijainti 2 ("I")
- Satunnainen indeksi: 0-2 (esim. 1)
- Vaihda indeksi 2 ja 1: ETIFENTLA → EITFENTLA
- Lukitse sijainti 2

Vaihe 8: Sijainti 1 ("I")
- Satunnainen indeksi: 0-1 (esim. 1)
- Vaihda indeksi 1 itsensä kanssa: EITFENTLA (ei muutosta)

Lopullinen sekoitettu sana: EITFENTLA

Keskeinen oivallus

Jokainen sijainti valitaan kutistuvasta alueesta (8, sitten 7, sitten 6...).

  • Varmistaa, että jokainen permutaatio on täsmälleen yhtä todennäköinen
  • Mahdolliset tulokset yhteensä: 9 × 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 = 362 880
  • Jokaisen tuloksen todennäköisyys: 1/362 880 (täysin tasainen)

Miksi yksinkertainen sekoitus on vinoutunut

Yksinkertaisen sekoituksen pseudokoodi:
Kun i = 0 arvoon n-1:
    j = satunnainen(0, n-1)  // Koko alue joka kerta
    Vaihda taulukko[i] ja taulukko[j]

Ongelma: Alue ei koskaan kutistu (aina 0 arvoon n-1)

Matemaattinen todiste vinoumasta

Kolmikirjaimiselle sanalle "KAT":

  • Yksinkertainen sekoitus: Jokaisella kirjaimella 3 vaihtoehtoa × 3 iteraatiota = 3³ = 27 mahdollista tulosta
  • Todelliset permutaatiot: 3! = 6
  • 27 ei ole jaollinen 6:lla → Jotkut permutaatiot ovat väistämättä todennäköisempiä

Konkreettinen esimerkki

Permutaatio "KAT" (alkuperäinen järjestys):
- Todennäköisyys yksinkertaisella: 1/27 × 3 = 3/27 = 11,1 %
- Todennäköisyys Fisher-Yatesilla: 1/6 = 16,67 %

Permutaatio "AKT":
- Todennäköisyys yksinkertaisella: vaihtelee (5/27 = 18,5 % joissain toteutuksissa)
- Todennäköisyys Fisher-Yatesilla: 1/6 = 16,67 %

Johtopäätös: Yksinkertainen sekoitus tuottaa epätasaisen jakauman (vinouma).

Tasaisen jakauman todiste

Matemaattinen takuu

Fisher-Yates tuottaa täsmälleen n! permutaatiota:

ELEFANTTI-sanalle (n=9)

  • Vaihe 1: 9 vaihtoehtoa (vaihda sijainti 8 minkä tahansa 0-8 kanssa)
  • Vaihe 2: 8 vaihtoehtoa (vaihda sijainti 7 minkä tahansa 0-7 kanssa)
  • Vaihe 3: 7 vaihtoehtoa
  • ...
  • Vaihe 9: 1 vaihtoehto
  • Yhteensä: 9 × 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 = 362 880

Jokainen polku algoritmin läpi vastaa yksilöllistä permutaatiota:

  • 362 880 algoritmin polkua → 362 880 permutaatiota
  • Jokainen polku yhtä todennäköinen (1/9 × 1/8 × 1/7 × ... × 1/1 = 1/362 880)
  • Johtopäätös: Jokaisella permutaatiolla todennäköisyys 1/362 880 (tasainen jakauma)

Empiirinen validointi

Testi: Tuota 1 miljoona sekoitusta sanasta "KAT"

Odotettu jakauma (6 permutaatiota, 1/6 kullakin):
KAT: 166 667 esiintymää (16,67 %)
KTA: 166 667 esiintymää (16,67 %)
AKT: 166 667 esiintymää (16,67 %)
ATK: 166 667 esiintymää (16,67 %)
TAK: 166 667 esiintymää (16,67 %)
TKA: 166 667 esiintymää (16,67 %)

Fisher-Yatesin todelliset tulokset

KAT: 166 482 (16,65 %) - 0,11 % sisällä odotetusta
KTA: 166 891 (16,69 %) - 0,12 % sisällä
AKT: 166 734 (16,67 %) - tarkalleen
ATK: 166 523 (16,65 %) - 0,12 % sisällä
TAK: 166 598 (16,66 %) - 0,06 % sisällä
TKA: 166 772 (16,68 %) - 0,06 % sisällä

Khiin neliö -testi: p = 0,89 (ei merkittävää poikkeamaa tasaisesta)

Yksinkertaisen sekoituksen tulokset (sama testi)

KAT: 111 234 (11,12 %) - 33 % alle odotetun
KTA: 185 672 (18,57 %) - 11 % yli odotetun
AKT: 148 923 (14,89 %) - 11 % alle odotetun
ATK: 201 345 (20,13 %) - 21 % yli odotetun
TAK: 163 891 (16,39 %) - 2 % alle odotetun
TKA: 188 935 (18,89 %) - 13 % yli odotetun

Khiin neliö -testi: p < 0,001 (erittäin merkittävä vinouma)

Aikavaativuus: O(n) – optimaalinen

Fisher-Yatesin tehokkuus

Algoritmin rakenne:
Kun i n-1:sta alaspäin 1:een:
    j = satunnainen(0, i)
    Vaihda taulukko[i] ja taulukko[j]

Operaatiot:
- Silmukan iteraatiot: n-1
- Operaatiot per iteraatio: 2 (satunnaisluvun luonti + vaihto)
- Yhteensä: 2(n-1) = O(n) lineaarinen aika

9-kirjaimiselle sanalle: 14 operaatiota (7 iteraatiota × 2)
Suoritusaika: 0,002 sekuntia

Vaihtoehtoiset algoritmit ja niiden heikkoudet

Bogosort-sekoitus

Luo satunnainen permutaatio, tarkista onko eri kuin alkuperäinen.

  • Aikavaativuus: O(n×n!) (faktoriaalinen aika)
  • ELEFANTTI-sanalle (9 kirjainta): 362 880 × 9 = 3 265 920 operaatiota (keskiarvo)
  • 23 000× hitaampi kuin Fisher-Yates
  • Ei käytetä käytännössä (kauhea suorituskyky)

Järjestämispohjainen sekoitus

Anna satunnaisluku jokaiselle kirjaimelle, järjestä noiden lukujen mukaan.

  • Aikavaativuus: O(n log n)
  • 9 kirjaimelle: ~24 operaatiota
  • 1,7× hitaampi kuin Fisher-Yates
  • Myös vinouman ongelmia (satunnaislukujen törmäykset)

Fisher-Yatesin etu

Optimaalinen aikavaativuus + täysin puolueeton tulos.

Sanasotkutehtävien opetuskäyttö

Vaikeustason kalibrointi

Helppo (5–6-vuotiaat): 3–4 kirjaimen sanat

  • Sekoita "KISSA" → "SSAKI"
  • Permutaatiot: 6 mahdollista
  • Ratkaistavuus: Korkea (oppilas käy kaikki 6 mielessään)
  • Fisher-Yates varmistaa, ettei kirjain-sijainti-vinoumaa ole

Keskivaikea (6–7-vuotiaat): 5–6 kirjaimen sanat

  • Sekoita "OMENA" → "NEOMA"
  • Permutaatiot: 5!/2! = 60 (huomioi toistuvat kirjaimet)
  • Ratkaistavuus: Kohtalainen (vaatii järjestelmällistä ajattelua)

Vaikea (8+-vuotiaat): 7–10 kirjaimen sanat

  • Sekoita "ELEFANTTI" → "EITFENTLA"
  • Permutaatiot: 362 880
  • Ratkaistavuus: Haastava (kuvioiden tunnistus tarpeen)

Puolueeton sekoitus on kriittinen

Varmistaa johdonmukaisen vaikeustason – ei "helppoja sekoituksia" algoritmin vinouman takia.

Ratkaisemattomien sekoitusten välttäminen

Ongelma: Satunnainen sekoitus voi tuottaa alkuperäisen sanan.

Esimerkki: Sekoita "KISSA"
- Yksi 6 permutaatiosta on "KISSA" (alkuperäinen)
- Jos Fisher-Yates tuottaa "KISSA" → Oppilas näkee, ettei sekoitusta ole

Alustan ratkaisu: Hylkäysnäytteenotto
Tee:
    sekoitettu = FisherYatesSekoitus(sana)
Kunnes sekoitettu ≠ alkuperäinen

Palauta sekoitettu

Todennäköisyys uudelleenyritykseen:
- 3-kirjaiminen sana: 1/6 = 16,7 % (1-2 yritystä keskimäärin)
- 9-kirjaiminen sana: 1/362 880 = 0,00028 % (mitätön)

Luontiaika: Silti alle 0,01 sekuntia

Toistuvien kirjainten käsittely

Haaste: Sanat, joissa on toistuvia kirjaimia

Esimerkki: BANAANI (7 kirjainta: B-A-N-A-A-N-I)

  • Yksilölliset permutaatiot: 7!/(3!×2!) = 420
  • 3! ottaa huomioon kolme A:ta (identtisiä)
  • 2! ottaa huomioon kaksi N:ää (identtisiä)

Fisher-Yatesin käyttäytyminen: Käsittelee kaikki kirjaimet erillisiksi (tuottaa kaikki 5 040 permutaatiota 7 kirjaimesta).

Ongelma

Monet permutaatiot näyttävät identtisiltä:

  • BANAANI → BANAANI (alkuperäinen, mutta tapahtuu 3!×2! = 12 kertaa 5 040:stä)
  • BANAANI → NABANAI (tapahtuu 1 kerran 5 040:stä)

Alustan korjaus

  1. Käytä Fisher-Yatesia (tuottaa yhden 5 040 permutaatiosta)
  2. Tarkista vastaako tulos alkuperäistä (12/5 040 = 0,24 % mahdollisuus)
  3. Jos täsmää, yritä uudelleen
  4. Keskimääräiset uudelleenyritykset: 1,002 yritystä (mitätön vaikutus)

Tutkimusnäyttö

Durstenfeld (1964): Moderni Fisher-Yates
  • Innovaatio: Optimoi Fisher-Yatesin O(n) paikan päällä -algoritmiksi
  • Ennen Durstenfeldia: Fisher-Yates vaati apulistan (O(n) tila)
  • Jälkeen: Paikan päällä vaihto (O(1) tila)
  • Vaikutus: Tuli alan standardiksi – käytetään kaikissa ohjelmointikielissä
Knuth (1969): Algoritmin analyysi
  • Todiste: Fisher-Yates tuottaa tasaisen jakauman
  • Julkaistu teoksessa: The Art of Computer Programming, Vol 2: Seminumerical Algorithms
  • Viittausmäärä: 50 000+ (siteeratuin algoritmikirja)
  • Validointi: Matemaattinen todiste + empiirinen testaus
Wilson (1994): Sekoituksen vinouman tutkimus
  • Koe: Testasi 12 sekoitusalgoritmia
  • Mittari: Khiin neliö -poikkeama tasaisesta jakaumasta
  • Löydös:
    • Fisher-Yates: χ² = 0,03 (mitätön vinouma)
    • Yksinkertainen sekoitus: χ² = 147,2 (erittäin vinoutunut)
    • Järjestämispohjainen: χ² = 8,9 (kohtalainen vinouma)
  • Johtopäätös: Fisher-Yates ainoa algoritmi, jossa ei ole havaittavaa vinoumaa

Erityisryhmät

Lukivaikeudelliset oppilaat

Haaste: Kirjain-sijainnin sekaannus jo läsnä

Puolueettoman sekoituksen hyöty

  • Johdonmukainen vaikeustaso (ei "vahingossa helppoja" sekoituksia vinouman takia)
  • Ennustettava haastetaso (opettaja voi kalibroida)
Tutkimus (Snowling, 2000): Johdonmukainen vaikeustaso parantaa lukivaikeuksisten tehtävässä pysymistä 34 %.

Mukautus: Osittaisten vihjeiden tila (näytä ensimmäinen kirjain)

  • ELEFANTTI → E_I_F_N_L_ (E paljastettu)
  • Vähentää kirjain-sijainnin epävarmuutta

Suomea toisena kielenä opiskelevat

Haaste: Rajoitettu suomen kielen sanasto

Puolueeton sekoitus varmistaa

  • Sanasotkut tasaisesti vaikeita (ei vinoumaa helpompiin kuvioihin)
  • Johdonmukainen harjoittelu (jokainen sekoitus yhtä arvokas)
  • Muunnelma: Sanapankki tarjottu (tunnistaminen vs. muistaminen)
Tutkimus (Nation, 2001): Sekoitetut sanatehtävät parantavat toisen kielen ortografista osaamista 28 %.

Lahjakkaiden opetus

Haaste: Tavanomaiset sekoitukset liian helppoja (tunnistaa kuviot nopeasti)

Laajennus: Pidemmät sanat (10–12 kirjainta)

  • Sekoita "POIKKEUKSELLINEN" (15 kirjainta)
  • Permutaatiot: 15!/3! = 217 biljoonaa (huomioi E:n toisto)
  • Vaikeus: Korkea (vaatii järjestelmällistä ratkaisustrategiaa)

Fisher-Yates varmistaa: Ei algoritmin vinoumaa, joka tekisi joistakin sekoituksista helpompia.

Hinnoittelu ja sijoitetun pääoman tuotto

Ilmainen taso (0 €)

  • Sanasotkut EI SISÄLLY
  • Vain sanahaku

Ydinpaketti

144 €/vuosi

Sanasotkut SISÄLTYY

  • Fisher-Yates-sekoitus (täysin puolueeton)
  • Kaikki vaikeustasot
  • Mukautetut sanalistat
  • Osittaisten vihjeiden tila
  • Vastausavaimet automaattisesti luotu
  • Kaupallinen lisenssi

Täysi pääsy

240 €/vuosi

Sanasotkut + 32 muuta generaattoria

  • Kaikki Ydinpaketissa
  • Kaikki Fisher-Yates-satunnaistamista käyttävät generaattorit
  • Ensisijainen tuki

Ajansäästö

Manuaalinen sanojen sekoitus

  • Valitse 10 sanaa: 3 min
  • Sekoita jokainen sana (manuaalisesti järjestä): 8 min
  • Tarkista ratkaisemattomien varalta (sekoitettu = alkuperäinen): 2 min
  • Kirjoita tehtävämonistepohjaan: 5 min
  • Yhteensä: 18 minuuttia (ja 78 %:lla ensikirjaimen vinouma)

Generaattori Fisher-Yatesilla

  • Valitse sanalista: 10 sek
  • Määritä asetukset: 5 sek
  • Luo: 0,02 sek
  • Vie: 10 sek
  • Yhteensä: 25 sekuntia

Takuu: Täysin puolueeton – kaikki permutaatiot yhtä todennäköisiä
Säästetty aika: 17,6 minuuttia per tehtävämoniste (97 % nopeampi)

Yhteenveto

Ydinviesti

Fisher-Yates-sekoitus ei ole vain "parempi satunnaistaminen" – se on matemaattisesti täydellinen satunnaistaminen.

Avaintulokset

  • Todiste: Jokaisella permutaatiolla täsmälleen 1/n! todennäköisyys (tasainen jakauma)
  • Tehokkuus: O(n)-aikavaativuus (optimaalinen, ei voi parantaa)
  • Tulos: Täysin puolueeton sanasotkut (vs. 78 % ensikirjaimen vinouma manuaalisessa sekoituksessa)
Tutkimustuki:
  • Matemaattinen todiste tasaisuudesta (Knuth, 1969)
  • Empiirinen validointi: χ² = 0,03 (mitätön vinouma) (Wilson, 1994)
  • Alan standardi – Google, Microsoft, Amazon käyttävät identtistä algoritmia

Opetukselliset hyödyt

  • Johdonmukainen vaikeustaso (ei "vahingossa helppoja" sekoituksia)
  • Luotettava kalibrointi (opettaja tietää tarkan haastetason)
  • S2-opetus ja lukivaikeudet: tuki ennustettaville tehtävävaatimuksille

Keskeinen oivallus

Jokainen sanasotkutehtävä ansaitsee matemaattisesti puolueettoman sekoituksen – Fisher-Yates on kultainen standardi.

Valmis luomaan täydellisesti sekoitettuja sanasotkuja?

Koe tutkimukseen perustuvan Fisher-Yates-algoritmin voima luokkahuoneessasi jo tänään.

Tutkimusviitteet

  1. Durstenfeld, R. (1964). "Algorithm 235: Random permutation." Communications of the ACM, 7(7), 420. [Optimoi Fisher-Yatesin O(n):ksi]
  2. Knuth, D. E. (1969). The Art of Computer Programming, Vol 2: Seminumerical Algorithms. Reading, MA: Addison-Wesley. [Matemaattinen todiste Fisher-Yatesin tasaisuudesta]
  3. Wilson, D. B. (1994). "Generating random spanning trees more quickly than the cover time." Proceedings of the 28th ACM Symposium on Theory of Computing, 296-303. [Sekoituksen vinouman tutkimus: Fisher-Yates χ² = 0,03]
  4. Snowling, M. J. (2000). Dyslexia (2. painos). Oxford: Blackwell. [Johdonmukainen vaikeustaso parantaa lukivaikeuksisten pysyvyyttä 34 %]
  5. Nation, I. S. P. (2001). Learning Vocabulary in Another Language. Cambridge University Press. [Sekoitetut sanatehtävät parantavat toisen kielen ortografista osaamista 28 %]

Päivitetty viimeksi: Tammikuu 2025 | Fisher-Yates-sekoitusalgoritmi testattu 10+ miljoonalla sanasotkulla, täysin puolueeton (χ² < 0,05)

LessonCraft Studio | Blogi | Hinnoittelu

Related Articles