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

How do I use Random generators in elm 0.17 with a user-specified seed?

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

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

Random.list 10 (Random.int 0 100)

通过像上面那样的调用,每次我输入相同的种子时,我都希望得到相同的 10 个随机数列表。但我根本不知道如何喂入种子。如果有任何帮助,我将不胜感激!

您指定的表达式 returns 一个 Generator。生成随机值的函数是 step,它接受一个 Generator 和一个 Seed 作为参数。可以使用函数 initialSeed 创建种子,该函数采用 Int ,用户可以将其指定为参数。

initialSeed 的相同参数将导致与输出相同的 Seed,这将导致每次相同的 List 随机 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

概述

生成随机值 Random, using user-specified seed is possible with Random.step

你需要指定一个Generator and a Seed,其中Generator a是一个生成a类型随机值的函数,使用整数Seed

要从整数创建 Seed,您需要使用 Random.initialSeed 函数,因为 Seed 不是普通整数,它是一个包含元信息的数据结构Generator

的后续步骤

Random.step

Generator a -> Seed -> (a, Seed)

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

例子

我做了一个完整的例子,展示了如何使用生成器产生随机值:Random value with user-specified seed

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

创建生成器

generator : Int -> Generator (List Int)
generator length =
    Random.list length (Random.int 0 100)

单步执行生成器

seed 可以通过用户输入指定,或者您可以在启动时将其作为标志传递。

Random.step (generator 10) seed