Random 如何在elm 0.17中使用随机生成器和用户指定的种子?
在Elm 0.17中,我希望运行一个依赖于随机数的程序,但我希望有一个用户指定的种子。这是为了在多个用户会话中获得可复制的结果:输入相同种子的用户应该看到相同的结果 但我不知道如何影响内置函数的行为,例如:Random 如何在elm 0.17中使用随机生成器和用户指定的种子?,random,elm,Random,Elm,在Elm 0.17中,我希望运行一个依赖于随机数的程序,但我希望有一个用户指定的种子。这是为了在多个用户会话中获得可复制的结果:输入相同种子的用户应该看到相同的结果 但我不知道如何影响内置函数的行为,例如: Random.list 10 (Random.int 0 100) 对于像上面这样的调用,每次输入同一个种子时,我都希望得到相同的10个随机数的列表。但我根本不知道如何喂种子。我将感谢任何帮助 指定的表达式返回一个生成器。生成随机值的函数是步骤,它将生成器和种子作为参数。可以使用函数ini
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建议或支持的原则?@BoshCmd
,当您没有用户指定的Seed
,在这种情况下,它依赖于当前时间戳,并作为I/O处理,如果您想了解更多细节,我建议你再问一个问题。琐碎的事情:在最后一行代码中有多余的)
。另外,对于Elm 0.19,似乎seed
必须不仅仅是一个整数-seed=Random.initialSeed
似乎有效。我非常感谢您的回复!你能解释一下我是如何通过Cmd将其连接回我的“应用程序”的,这样结果就可以流入我的“更新”函数中吗?下面是我用来测试的内容:。在本例中,种子是整个模型,因此更新函数会更新种子。然后,view函数计算随机数列表。另一种方法是让update函数计算随机数列表并将其存储在模型中。