榆树产生随机数

时间:2016-02-06 00:19:40

标签: random elm

我想在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,但我并不了解所有内容。

2 个答案:

答案 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; - 。它的工作方式与核心库相同,但算法要好得多,种子上的文档也没有明显的错误。