我想在elm中的两个值之间生成一个随机int。 像这样:
nb = random(0, 10)
我已阅读过doc和多篇文章。最佳答案来自此stackoverflow post
gen = Random.int 0 10
seed0 = Random.initialSeed 123456
Random.generate gen seed0
但问题是,它总是会返回相同的价值,而且它甚至不是一个类似的东西:
(7,Seed { state = State 645041272 40692, next = <function>, split = <function>, range = <function> })
: ( Int, Random.Seed )
所以从doc开始,最好使用种子的当前时间。但我怎么得到它?我必须使用信号吗?有没有一种简单的方法来获取时间戳?
我很混淆,我需要为种子生成一个随机int,这样我就可以生成一个随机的int。如果不是,则生成的随机int不是随机的。我想我误解了一些事情......
编辑:我也发现了post,但我并不了解所有内容。
答案 0 :(得分:5)
已更新为0.18
app =
Html.programWithFlags
{ init = init
, update = update
, view = view
, subscriptions = always Sub.none
}
init : {startTime : Float} -> Model
init {startTime} =
{ blankModel | randomSeed = Random.initialSeed <| round startTime }
的index.html
<script type="text/javascript">
var yourPgm = Elm.fullscreen(Elm.Main, {startTime: Date.now()});
</script>
原始答案
纯编程中的随机数很复杂,但这是我在games之一(使用Elm Architecture)中的方法:
<强> Main.elm 强>
startTimeSeed : Seed
startTimeSeed = Random.initialSeed <| round startTime
app =
StartApp.start
{ init = (init 8 8 startTimeSeed, Effects.none)
, update = update
, view = view
, inputs = []
}
port startTime : Float
<强>的index.html 强>
<script type="text/javascript">
var yourPgm = Elm.fullscreen(Elm.Main, {startTime: Date.now()});
</script>
换句话说,当你开始游戏时,通过端口传递时间戳
答案 1 :(得分:4)
它总是返回相同的值
这是纯随机数生成器的工作原理。你传入一粒种子,然后又找回另一粒种子。
它甚至不是一个像这样的东西[疯狂的代码片段]
这是一对价值观。第一个是您正在寻找的int。第二个是生成随机值的新种子。不要担心种子实际上是什么;它应该是不透明的。您可以使用fst
获取对中的int,但如果您想要更多随机数,则需要新种子。
因此,从文档来看,最好将当前时间用于种子。
此文档错误,错误,错误。正如您所发现的那样,获取当前时间戳并不是一种简单的方法。如果你从JS那里传递它,就像Simon建议的那样,只需使用Math.floor(Math.random()*0xFFFFFFFF)
。这为您提供了在可能的输入空间上更好地采样的种子。
这非常重要,因为随机数生成器将输出类似种子的类似值。例如,如果您使用任何少于53668的种子并生成一个bool,则它将为True
。这是因为所用算法存在缺陷。
更好的解决方案: - &gt; use this library &lt; - 。它的工作方式与核心库相同,但算法要好得多,种子上的文档也没有明显的错误。