如何在榆树中洗牌?

Cod*_*rer 7 elm

假设我有一个包含数字1到5的列表.如何在Elm中编写一个函数,shuffleList使得它将整数列表作为参数并返回列表的随机版本?

例如,

shuffleList [1,2,3,4,5]
{-5,1,2,4,3-}
Run Code Online (Sandbox Code Playgroud)

可以对随机种子进行硬编码

rob*_*oby 8

你可能想要shuffleelm-community/random-extra的功能.在Ellie上使用它的例子

如果您想手动执行此操作,虽然初始化Seed您可以执行以下操作(这使用了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"
Run Code Online (Sandbox Code Playgroud)

Ellie上使用它的一个例子