我想要一个stdGen
在没有 IO 的情况下在每次调用中返回不同的函数。我尝试使用unsafePerformIO
, 作为以下代码。
import System.IO.Unsafe
import System.Random
myStdGen :: StdGen
myStdGen = unsafePerformIO getStdGen
但是当我尝试调用myStdGen
ghci 时,我总是得到相同的值。我虐待了unsafePerformIO
吗?或者还有其他方法可以达到我的目标吗?
编辑 对不起,我想我应该更准确地描述我的问题。
实际上,我正在实现一个变体的数据结构,它需要一个特殊的“合并”操作。它依赖于一些随机性来保证摊销的 O(log n) 预期时间复杂度。
我尝试使用一对like(Tree, StdGen)
来为每个trap 保留随机生成器。在向 treap 插入新数据时,我会使用random
随机值给新节点,然后更新我的生成器。但是我遇到了一个问题。我有一个调用函数empty
,它将返回一个空的treap,我使用myStdGen
上面的函数来获取这个treap 的随机生成器。但是,如果我有两个空的trep,它们StdGen
将是相同的。因此,在我将数据插入到两个treap 之后,当我想合并它们时,它们的随机值也将是相同的。因此,我失去了我所依赖的随机性。
这就是为什么我想要一个“全局”随机生成器,它StdGen
为每次调用产生不同的结果,这样每个空的treap 可以有不同的StdGen
.