如何在Windows机器上播种SML/NJ的随机数发生器?在Windows机器上播种SML/NJ的RNG
函数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)的选项?
这应该工作。奇怪的是,我曾多次看过“时间”,但忽略了这一点。我得到了这样的印象,即'时间'被设计为解析从'Timer'返回的值,但是它本身不包含时钟信息。 –
我在正常的基础文档中错过了它,将更新答案以反映其标准功能 – matt