list - 如何在haskell中创建一个随机列表
问题描述
我是haskell的新手,遇到了这个问题:正如标题所说,我正在尝试使用随机数创建一个给定长度的列表,范围在一些x和y之间。例如,如果 x=0 且 y=10,则列表将类似于:[0,4,3,8,0,2]。我宁愿用列表理解来做,没有任何 IO。我看过一些关于类似主题的帖子,但到目前为止没有一个对我有帮助。
解决方案
System.Random
在包中使用random
,这正是功能randomRs
:
randomRs :: (Random a, RandomGen g) => (a, a) -> g -> [a]
它需要一个值范围和一个生成器,并返回该范围内的随机值的惰性列表。您可以使用以下方法从固定种子制作生成器mkStdGen
:
mkStdGen :: Int -> StdGen
例如,这是一个种子(在我的机器上,使用我的特定版本random
)巧合地产生您提供的示例值:
> take 6 $ randomRs (0, 10) $ mkStdGen 15915
[0,4,3,8,0,2]
如果您希望程序在每次调用时产生不同的随机值,则必须使用 IO 为随机数生成器播种当前时间。为此,您可以newStdGen
改用:
newStdGen :: IO StdGen
一个完整的例子:
import System.Random (newStdGen, randomRs)
main :: IO ()
main = do
gen <- newStdGen
print $ randomList 6 0 10 gen
randomList
:: (Random a, RandomGen g)
=> Int -> a -> a -> g -> [a]
randomList len lo hi gen = take len $ randomRs (lo, hi) gen
推荐阅读
- php - 如何检测 CLI PHP 进程/窗口是否使用“X”按钮关闭?
- python - 如何使用 Graph API 永久删除电子邮件?
- javascript - 有没有办法以 HTML 格式请求访问计算机上的本地存储?
- angular - 使用 akita-ng-fire 时如何避免“this.fireAuth.auth.createUserWithEmailAndPassword 不是函数”
- reactjs - 我已经成功启动了 npm,但是现在当我尝试点击 npm start 时,我发现下面提到的错误:
- node.js - 如何在我的 Google 操作中使用使用 Oauth 操场获得的刷新和访问令牌来调用 People API?
- rust - 如何使用 zbus 列出块设备?
- java - Maven构建依赖问题
- react-native - 如何在场景加载时禁用 iOS 反弹效果?
- javascript - 在 asp.net 网络表单中使用 Sweet 警报删除行