Random 如何在elm 0.17中使用随机生成器和用户指定的种子?

Random 如何在elm 0.17中使用随机生成器和用户指定的种子?,random,elm,Random,Elm,在Elm 0.17中,我希望运行一个依赖于随机数的程序,但我希望有一个用户指定的种子。这是为了在多个用户会话中获得可复制的结果:输入相同种子的用户应该看到相同的结果 但我不知道如何影响内置函数的行为,例如: Random.list 10 (Random.int 0 100) 对于像上面这样的调用,每次输入同一个种子时,我都希望得到相同的10个随机数的列表。但我根本不知道如何喂种子。我将感谢任何帮助 指定的表达式返回一个生成器。生成随机值的函数是步骤,它将生成器和种子作为参数。可以使用函数ini

在Elm 0.17中,我希望运行一个依赖于随机数的程序,但我希望有一个用户指定的种子。这是为了在多个用户会话中获得可复制的结果:输入相同种子的用户应该看到相同的结果

但我不知道如何影响内置函数的行为,例如:

Random.list 10 (Random.int 0 100)

对于像上面这样的调用,每次输入同一个种子时,我都希望得到相同的10个随机数的列表。但我根本不知道如何喂种子。我将感谢任何帮助

指定的表达式返回一个
生成器
。生成随机值的函数是
步骤
,它将
生成器
种子
作为参数。可以使用函数
initialSeed
创建种子,该函数将用户可以指定的
Int
作为参数

initialSeed
的同一参数将产生与输出相同的
Seed
,每次将产生相同的
随机
Int
值列表。下面的函数说明了这一点

randomSequence : Int -> List Int
randomSequence int = 
    let gen = Random.list 10 (Random.int 0 100)
        s = initialSeed int
        (res, ns) = step gen s  
    in res
概述 可以使用用户指定的种子生成随机值

您需要指定a和a,其中
生成器a
是使用整数
种子生成
a
类型的随机值的函数

要从整数创建
种子
,您需要使用函数,因为
种子
不是一个普通整数,它是一个数据结构,包含
生成器后续步骤的元信息

随机步
生成器a->Seed->(a,Seed)

调用将返回一个新状态
(a,Seed)
,其中
a
是您的随机值,
Seed
是生成下一个随机值所需的种子

例子 我制作了一个全面的示例,演示了如何使用生成器生成随机值:

这个例子对于答案来说可能太大了,所以我将强调最重要的部分:

创建一个生成器
generator:Int->generator(列表Int)
发电机长度=
Random.list长度(Random.int 0 100)
步进发电机
种子可以通过用户输入指定,也可以在启动时将其作为标志传递

Random.step(生成器10)种子

这非常有用。你能解释一下我如何通过Cmd将它连接回我的“应用程序”,这样结果就可以流入我的“更新”功能吗?@Bosh在这种情况下你不需要
Cmd
。我已经更新了,使逻辑更加明确。结果总是存在的!非常有启发性,再次感谢!有一件事让我感到困惑的是,示例和指南中的建议似乎传达了Cms是实现这种行为的适当方式的想法。我是否违背了Elm建议或支持的原则?@Bosh
Cmd
,当您没有用户指定的
Seed
,在这种情况下,它依赖于当前时间戳,并作为I/O处理,如果您想了解更多细节,我建议你再问一个问题。琐碎的事情:在最后一行代码中有多余的
。另外,对于Elm 0.19,似乎
seed
必须不仅仅是一个整数-
seed=Random.initialSeed
似乎有效。我非常感谢您的回复!你能解释一下我是如何通过Cmd将其连接回我的“应用程序”的,这样结果就可以流入我的“更新”函数中吗?下面是我用来测试的内容:。在本例中,种子是整个模型,因此更新函数会更新种子。然后,view函数计算随机数列表。另一种方法是让update函数计算随机数列表并将其存储在模型中。