繁体   English   中英

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

[英]How to generate List of random numbers in Haskell

我想在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。 提前致谢。

步骤1:声明一个空的Int List ...

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

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

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

请注意,这不是forM_而是forM ,它会自动将结果收集在列表中–就是您想要的! 我实际上不需要index参数(因此, i变量的_前缀)。 我也可以写mapM (const $ randomRIO (1,50)) [1 .. lLength] ,或者确实只是replicateM lLength $ randomRIO (1,50) ,作为user3237465的评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM