首页 > 解决方案 > SML 日期结构

问题描述

我一直试图弄清楚 SML 中的随机数生成。有一个标准库函数,每次计算都需要一个新的种子

let
    val seed = Random.rand (123,456)
in
    List.tabulate(5, fn i => Random.randRange (1,100)  seed)
end

val it = [26,39,64,39,84] : int list

这很好用,但除非你seed每次都用一个新的数字对更新,否则你会得到相同的随机数。在这里找到了一种获取新数字的方法,但这似乎已经过时,即它似乎不起作用——或者我只是没有正确使用它。

val seed = 
    let
        val Date.DATE(d) = Date.fromTime(Time.now())
        val m            = #minute d
        val s            = #second d
    in
        m,s)
    end

fun random (l,h) = Random.randRange (l,h) seed

具体来说,我无法得到

val Date.DATE(d) = Date.fromTime(Time.now())

去工作。我试过了

- val Date.DATE(d) = Date.fromTimeLocal(Time.now());

但我得到了错误

stdIn:7392.1-7392.10 Error: unbound variable or constructor: DATE in path Date.DATE
stdIn:7392.1-7392.10 Error: variable found where constructor is required: Date.DATE
stdIn:7392.1-7392.12 Error: constant constructor applied to argument in pattern:bogus

但是,这有效

- val mydate = Date.fromTimeLocal(Time.now())
val mydate =
:   DATE
:     {day=17,hour=22,isDst=SOME true,minute=27,month=Apr,
:      offset=SOME (TIME {usec=#}),second=3,wday=Fri,yday=107,year=2020}
:   : Date.date

但作为初学者,我真的不知道如何从mydate. 似乎Date.DATE(d) =应该将评估“投射”到d记录字段可以访问的变量中,#minute并且#second......非常感谢一些解释。(Date结构。)

标签: datetimesmlrandom-seed

解决方案


常见问题解答非常过时,似乎使用了非常古老的Date结构。

这对我有用:

val seed = 
    let
        val d = Date.fromTimeLocal(Time.now())
        val m = Date.minute d
        val s = Date.second d
    in
        Random.rand (m,s)
    end;

fun random (l,h) = Random.randRange (l,h) seed;

测试:

- random (1,10);
val it = 7 : int
- random (1,10);
val it = 8 : int
- random (1,10);
val it = 7 : int
- random (1,10);
val it = 4 : int
- random (1,10);
val it = 3 : int

推荐阅读