gpt4 book ai didi

haskell - 简单的随机数生成

转载 作者:行者123 更新时间:2023-12-03 20:24:53 25 4
gpt4 key购买 nike

经过一段时间令人沮丧的研究,我正在写这篇文章,我希望这里有人可以启发我关于这个主题。

我想在 haskell 函数中生成一个简单的随机数,但是,如果没有各种非平凡的元素,例如 Monads、“do”中的指定、创建生成器等,这似乎是不可能的。

理想情况下,我正在寻找相当于 C 的“rand()”。但是经过大量搜索,我非常确信没有这样的事情,因为语言的设计方式。 (如果有,请有人赐教)。由于这似乎不可行,我想找到一种方法来为我的特定问题获取随机数,以及如何获取随机数的一般解释。

prefixGenerator :: (Ord a, Arbitrary a) => Gen ([a],[a])
prefixGenerator = frequency [
(1, return ([],[])),
(2, do {
xs1 <- orderedListEj13 ;
xs2 <- orderedListEj13 ;
return (xs1,xs2)
}),
(2, do {
xs2 <- orderedListEj13 ;
return ((take RANDOMNUMBERHERE xs2),xs2)
})
]

我正在尝试使用 QuickCheck,但我无法使用随机数使其变得很困难。我试过类似 this (通过放置一个 drawInt 0(长度 xs2)而不是 RANDOMNUMBERHERE)但是我被一个事实困住了 take 需要一个 Int 并且该方法给我留下了一个 IO Int,根据 this 这似乎不可能转换为一个 Int | .

最佳答案

由于haskell 是一种纯函数式编程语言,因此函数在引用上是透明的,这意味着只有函数的参数才能确定其结果。如果您能够从空气中提取一个随机数,您可以想象这将如何导致问题。

我想你需要这样的东西:

prefixGenerator :: (Ord a, Arbitrary a) => Gen ([a],[a])
prefixGenerator = do
randn <- choose (1,999) -- number in range 1-999
frequency [
(1, return ([],[])),
(2, do {
xs1 <- orderedListEj13 ;
xs2 <- orderedListEj13 ;
return (xs1,xs2)
}),
(2, do {
xs2 <- orderedListEj13 ;
return ((take randn xs2),xs2)
})
]

一般来说,在haskell中,您可以通过从IO monad中提取一些随机性,或者通过维护一个用一些整数种子硬编码或从IO中提取的PRNG来处理随机数生成(gspr的评论非常好)。

阅读伪随机数生成器的工作原理可能会帮助您理解 System.Random , 和 this也可能有所帮助(向下滚动到随机性部分)。

关于haskell - 简单的随机数生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9743991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com