gpt4 book ai didi

haskell - 如何在 Haskell 中生成随机数列表

转载 作者:行者123 更新时间:2023-12-01 19:18:03 24 4
gpt4 key购买 nike

我想在 Haskell 中生成随机数列表。

Step 1 : declare an empty Int List 
Step 2 : Generate a random number between 1 to 50
Step 3 : Add that number at the end of the List.
Step 4 : Repeat Step 2 and 3 for 5 times.

我使用数组编写了代码。

import System.Random 
import Data.Array.IO
main = do
arr <- newArray (1,5) 0 :: IO (IOArray Int Int)

forM_ [1..5] (\i -> do
v <- getStdRandom(randomR (1,50))
writeArray arr i v)

forM_ [1..5] (\i -> do
a <- readArray arr i
print (a))

示例输出如下:-

Prelude> main
32
14
27
23
33

如何使用列表来实现这一点。可能正在使用 MVar 或 TVar List。提前致谢。

最佳答案

Step 1 : declare an empty Int List...

不要那样做。创建一个空的东西然后填充它很少是一个好主意。有时,出于性能原因,创建一个未初始化的数组(不是空的,而是“空的”)然后在事后定义内容可能是明智的 - 这基本上就是代码中发生的情况。同样合理的是:从一个空的 Set 开始,逐渐填充它;这可以在纯功能状态 monad 中很好地完成。

但是对于列表(或数组),从空开始永远不会给你带来任何好处;为什么不立即正确定义完整结果列表?就这么简单:

    do
...
randList <- forM [1 .. lLength] $ \_i -> randomRIO (1,50)
...

请注意,这不是 forM_ 而是 forM,它会自动将结果收集到列表中 - 这正是您想要的!我实际上不需要索引参数(因此 i 变量的 _ 前缀)。我也可以写成 mapM (const $ randomRIO (1,50)) [1 .. lLength],或者简单地写成 replicateM lLength $ randomRIO (1,50),正如用户3237465评论。

关于haskell - 如何在 Haskell 中生成随机数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27343418/

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