【发布时间】:2017-03-27 01:43:21
【问题描述】:
如何在 Windows 机器上播种 SML/NJ 的随机数生成器?
函数Random.rand() 接受一对整数,并使用它们作为随机数生成器的种子。根据我对其他编程语言的经验,我希望有一种相对简单的方法可以根据系统时钟来播种它(类似于 C 中的srand(time(null));)。除非我忽略了一些明显的东西,否则似乎没有任何直接的方法,至少如果您使用的是 Windows。
我能在 SML 中找到最接近 time(null) 的是 Posix.ProcEnv.time,它返回 Unix 纪元时间。不幸的是,Posix 结构不是 Windows 下载的一部分,Windows 结构(它是)似乎不包括time 的任何直接类似物。
Timer 结构确实有方法可以实时确定经过。我可以编写一个函数来进行大约半秒的无意义计算,计算需要多长时间,然后找出一种从中提取几个整数的方法。但是:1)对于大多数语言中微不足道的事情来说,这是一项非常艰巨的工作,2)更重要的是——它似乎可能导致同一个种子被重用的次数不平凡。
我的另一个想法是,如果我可以访问 Windows 环境变量 "TIME",我就可以使用它。以下将时间打印到 repl:
OS.Process.system "TIME/T";
但不提供对打印字符串的任何编程访问。
OS.Process.getEnv "TIME";
听起来很有希望,但返回 NONE。
如果在 SML/NJ 中确实没有简单的解决方案 - 是否有适用于 SML 的其他一些实现(例如 Poly/ML)的选项?
【问题讨论】: