List Elm随机列表实现

List Elm随机列表实现,list,random,elm,List,Random,Elm,Elm标准库提供了运行良好的功能。 通过查看,我们可以看到列表是以Functional样式构建的,即从末尾到开头。生成足够的元素后,将返回反向列表: if n < 1 then (List.reverse list, seed) 如果nGenerator a->Generator(列表a) 列表n(生成器生成)= 发电机 listHelp[]n生成种子 listHelp:List a->Int->(Seed->(a,Seed))->Seed->(List a,Seed) list

Elm标准库提供了运行良好的功能。 通过查看,我们可以看到列表是以Functional样式构建的,即从末尾到开头。生成足够的元素后,将返回反向列表:

if n < 1 then
    (List.reverse list, seed)
如果n<1,则
(列表。反向列表,种子)

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

可能是因为大多数随机生成器不是真正随机的。如果你用相同的种子启动它们,你会得到相同的序列。如果您依赖这个事实进行测试,那么让序列以相反的顺序返回可能会破坏您的测试


这是假设大多数程序员都希望生成的序列是按列表顺序的,即第一项是第一个生成的。我认为这是一个可能的假设。因此,值得在最后颠倒列表,这样api就不那么令人惊讶了

List.reverse调用实际上将列表按生成顺序放回原位

以下是相关功能的代码:

list:Int->Generator a->Generator(列表a)
列表n(生成器生成)=
发电机
listHelp[]n生成种子
listHelp:List a->Int->(Seed->(a,Seed))->Seed->(List a,Seed)
listHelp列表n生成种子=
如果n<1,则
(列表。反向列表,种子)
其他的
让
(价值,新闻种子)=
产生种子
在里面
列表帮助(值::列表)(n-1)生成新种子
如果我们从概念上将种子的概念简化为
Int
,并假设我们有一个返回
(种子,种子+1)
的生成器,如果我们的初始种子是
1
(生成5个元素的列表),您可以这样对迭代进行推理:

最后的输出列表将被颠倒,为您提供
[1,2,3,4,5]

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

考虑在最后一步中列表是否没有反转(假设
initialSeed
1

List.head(List 5(myGen initialSeed))==5
List.head(List 4(myGen initialSeed))==仅4

由于所有这些伪随机性都需要一个
种子
作为输入,因此以一种可预测的方式对事物进行推理比引入一种会使
列表
不可预测的任意重新排序更有意义<代码>列表。反向修复输出并将其放回可预测的领域。

因为我们可以将单个值预先添加到列表中,并且只能将列表附加到列表中。我们可以

append list [value]
然后我们就不必把它倒过来了


因为我们可以将单个值预先添加到列表中,而只能将列表追加到列表中。所以这只是一个实施的问题
append list [value]