gpt4 book ai didi

list - Elm 随机列表实现

转载 作者:行者123 更新时间:2023-12-01 00:45:14 25 4
gpt4 key购买 nike

Elm 标准库提供 a function to generate random lists这工作正常。
通过查看 its implementation ,我们可以看到列表是以函数式的方式构造的,即从末尾到开头。当生成了足够多的元素时,返回反向列表:

if n < 1 then
(List.reverse list, seed)

我想知道为什么我们需要颠倒这个列表?是否有必要确保“正确”的随机性?

最佳答案

List.reverse call 实际上将列表放回其生成顺序。

以下是相关函数的代码:

list : Int -> Generator a -> Generator (List a)
list n (Generator generate) =
Generator <| \seed ->
listHelp [] n generate seed

listHelp : List a -> Int -> (Seed -> (a,Seed)) -> Seed -> (List a, Seed)
listHelp list n generate seed =
if n < 1 then
(List.reverse list, seed)
else
let
(value, newSeed) =
generate seed
in
listHelp (value :: list) (n-1) generate newSeed

如果我们在概念上将种子的概念简化为 Int ,并假设我们有一个返回 (seed, seed + 1) 的生成器,如果我们的初始种子是 1,你可以这样推理迭代。 (生成 5 个元素的列表):
listHelp [] 5 myGen 1 -- initial state
listHelp [1] 4 myGen 2
listHelp [2,1] 3 myGen 3
listHelp [3,2,1] 2 myGen 4
listHelp [4,3,2,1] 1 myGen 5
listHelp [5,4,3,2,1] 0 myGen 6

然后反转最终输出列表为您提供 [1,2,3,4,5] .

最终的排序与函数的整体随机性没有任何关系,但如果您要使用相同的种子运行多个列表但请求不同的列表大小,它确实会给您一个可预测的结果。

考虑列表在最后一步中是否没有反转(假设 initialSeed1 )。

List.head (list 5 (myGen initialSeed)) == Just 5
List.head (list 4 (myGen initialSeed)) == Just 4

由于所有这些伪随机性都需要一个 Seed作为输入,以可预测的方式推理事物更有意义,而不是引入会使 list 的任意重新排序。不可预测的。 List.reverse修复输出并将其放回可预测领域。

关于list - Elm 随机列表实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35010685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com