如何在带有用户指定种子的 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
在 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