2017-02-13 28 views
5

Załóżmy, że mam listę zawierającą cyfry od 1 do 5. Jak napisać funkcję w Wiąz o nazwie shuffleList tak, że pobiera ona listę liczb całkowitych jako argument i zwraca losową wersję listy?Jak przetasować listę w wiąz?

np

shuffleList [1,2,3,4,5] 
{-5,1,2,4,3-} 

Jest OK, aby hardcode losowych

+0

http://package.elm-lang.org/pa ckages/mgold/Elm-Random-Sampling/2.0.3/Random-Array –

+0

Przykład kodu tej biblioteki nie działa –

+0

http://tylerscode.com/2016/06/list-shuffle-elm/ – wintvelt

Odpowiedz

7

Prawdopodobnie chcesz funkcję shuffle z wiązu Wspólnoty/random-extra. Przykład użycia że na Ellie

Jeśli chcesz zrobić to ręcznie, choć biorąc pod uwagę wstępny Seed można wykonać następujące czynności (to sprawia, że ​​korzystanie z niektórych funkcji z pakietu elm-community/list-extra)

import List.Extra exposing (getAt, removeAt) 
import Random exposing (Seed, int, step) 

shuffleList : Seed -> List a -> List a 
shuffleList seed list = 
    shuffleListHelper seed list [] 


shuffleListHelper : Seed -> List a -> List a -> List a 
shuffleListHelper seed source result = 
    if List.isEmpty source then 
     result 
    else 
     let 
      indexGenerator = 
       int 0 ((List.length source) - 1) 

      (index, nextSeed) = 
       step indexGenerator seed 

      valAtIndex = 
       getAt index source 

      sourceWithoutIndex = 
       removeAt index source 
     in 
      case valAtIndex of 
       Just val -> 
        shuffleListHelper nextSeed sourceWithoutIndex (val :: result) 

       Nothing -> 
        Debug.crash "generated an index outside list" 

Przykładowy za pomocą tego na Ellie