Haskell:如何播种(设置使用的熵)Data.Random?

时间:2018-07-22 02:29:19

标签: haskell random random-seed

Haskell offers中的random-fu(Data.Random)程序包如下示例:

import Data.Random
import System.Random.MWC

logNormal :: Double -> Double -> RVar Double
logNormal mu sigmaSq = do
  x <- normal mu sigmaSq
  return (exp x)

main = do
  mwc <- create
  y <- sampleFrom mwc (logNormal 5 1)
  print y

它总是产生相同的结果。我想从时钟开始播种。理想情况下,不必通过实际阅读时间弄脏我的手。

(我在random-fu文档中的任何地方都没有看到“种子”一词,但是我在一些地方找到了短语“熵的来源”。)

1 个答案:

答案 0 :(得分:2)

如果要从时钟开始播种,可以使用getPOSIXTime获得时间。如Silvio Mayolo所建议,使用createSystemRandom可能更有意义。这两种方法都在下面的代码中进行了演示。

import Data.Random
import Data.Vector (singleton)
import Data.Time.Clock.POSIX (getPOSIXTime)
import System.Random.MWC

logNormal :: Double -> Double -> RVar Double
logNormal mu sigmaSq = do
  x <- normal mu sigmaSq
  return (exp x)

main = do

  t0 <- getPOSIXTime 
  mwc <- initialize (singleton (floor t0))
  y <- sampleFrom mwc (logNormal 5 1)
  print y

  mwc2 <- createSystemRandom
  z <- sampleFrom mwc2 (logNormal 5 1)
  print z