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

Amm*_*osh 2 haskell ghci

我想在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.
Run Code Online (Sandbox Code Playgroud)

我用Array编写了代码.

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))
Run Code Online (Sandbox Code Playgroud)

示例输出如下: -

Prelude> main
32
14
27
23
33
Run Code Online (Sandbox Code Playgroud)

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

lef*_*out 5

第1步:声明一个空IntList ...

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

但是对于列表(或数组),从空开始永远不会获得任何东西; 为什么不立即正确定义完整的结果列表?这很简单:

    do
      ...
      randList <- forM [1 .. lLength] $ \_i -> randomRIO (1,50)
      ...
Run Code Online (Sandbox Code Playgroud)

请注意,这不是,forM_forM会自动将结果收集到列表中 - 正是您想要的!我实际上并不需要index参数(因此_i变量的前缀).我也可以写mapM (const $ randomRIO (1,50)) [1 .. lLength],或者简单地replicateM lLength $ randomRIO (1,50),作为user3237465评论.