我如何在Haskell中生成随机数而没有IO在一定范围内?

问题描述 投票:0回答:1

我想在一个范围内生成随机数,并且类型签名为Int -> Int。我已经阅读了其他多篇文章,但是没有一篇文章建议返回类型Int的方法。我在代码中使用了System.IO.Unsafe,但不建议这样做。这是我的代码:

import System.IO.Unsafe

-- random number generator
rng :: Int -> Int
rng upper = unsafePerformIO $ randomRIO (0,upper-1) 

有人对在Haskell范围内如何生成随机Int有任何建议吗?

编辑:可能无法更改IO Int -> Int,所以我将代码转换为

-- random number generator
rng :: Int -> IO Int
rng upper = randomRIO (0,upper-1) 

之所以需要rng是因为我想获取列表范围长度内的随机数,以获得列表元素的索引。

list !! rng (length list),但出现错误Couldn't match expected type ‘Int’ with actual type ‘IO Int’

我是Haskell的新手,我不知道如何操纵Monad。任何帮助表示赞赏。

haskell random
1个回答
0
投票

[Haskell并非不使用IO而不能生成随机数。

您的示例list !! rng (length list),不起作用,因为rng返回IO Int,并且!!需要Int

这里是使用您的rng函数从列表中获取随机元素的函数:

-- Will crash on empty list
randomElementFromList :: [Int] -> IO Int
randomElementFromList list = do
  r <- rng (length list)
  return $ list !! r
© www.soinside.com 2019 - 2024. All rights reserved.