F#洗牌功能

问题描述 投票:0回答:2

我一直在尝试用 F# 创建一个简单的纸牌游戏,我使用 system.Random 创建了一个简单的随机化器函数。


type card = int
type deck = card list
let rand : int -> int = let rnd = System.Random ()
                        in fun n -> rnd.Next (0 , n )

但是我的问题是我不知道如何使用 rand 函数创建随机播放功能牌组 -> 牌组。

需要任何帮助。

arraylist random f# shuffle
2个回答
3
投票

编辑:正如 Okke Hendriks 所指出的,这不是一个好的解决方案。 请勿使用。

您可以根据随机值进行排序:

let shuffle (d:deck) =
    let rnd = System.Random ()
    d |> List.sortBy(fun _ -> rnd.Next(1, 52) )

1
投票

我想指出,如果洗牌后的牌组应该均匀分布,则一定不能使用AMieres提出的解决方案。请参阅这篇维基百科文章

“上述方法的一个变体在支持使用用户指定的比较函数进行排序的语言中得到了一些使用,即通过使用返回随机值的比较函数对列表进行排序来打乱列表。但是,这是一个非常糟糕的方法:它很可能产生高度不均匀的分布,这在很大程度上取决于所使用的排序算法。”

作为替代方案,请参阅此SO答案

© www.soinside.com 2019 - 2024. All rights reserved.