如何在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