生成更均匀分布的随机序列

dem*_*mas 1 random haskell

我已经阅读了这个问题,并认为这个算法不是最优的.例如,'f 20 100'返回的列表如[85,14,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0]; 结果我经常得到一个很长的零尾.

好吧,我认为这是一个有趣的任务,并决定创建自己的实现:)

我决定以随机比例划分数字:

g 1 sum = return [sum]
g n sum = do
    prop <- randomRIO(0.0, 1.0)
    k1 <- g (round prop * n) (round( prop * sum))
    k2 <- g (n - (round prop * n)) (sum - (round prop * sum))
    return k1 ++ k2
Run Code Online (Sandbox Code Playgroud)

但我的代码不起作用:

   Couldn't match expected type `IO [a0]' with actual type `[a1]'
    In the expression: return k1 ++ k2
    In the expression:
      do { prop <- randomRIO (0.0, 1.0);
           k1 <- g (round prop * n) (round (prop * sum));
           k2 <- g (n - (round prop * n)) (sum - (round prop * sum));
             return k1 ++ k2 }
    In an equation for `g':
        g n sum
          = do { prop <- randomRIO (0.0, 1.0);
                 k1 <- g (round prop * n) (round (prop * sum));

                 k2 <- g (n - (round prop * n)) (sum - (round prop * sum));
                 .... }
Run Code Online (Sandbox Code Playgroud)

正如我所见,我无法连接IO列表.我该如何解决?

kos*_*kus 6

您询问的类型错误是由您应该写的事实引起的

return (k1 ++ k2)
Run Code Online (Sandbox Code Playgroud)

而不是

return k1 ++ k2
Run Code Online (Sandbox Code Playgroud)

请注意,这return只是Haskell中的一个函数,并且函数应用程序比任何其他中缀运算符更强大,因此您的代码读取到Haskell,就像您已经编写

(return k1) ++ k2
Run Code Online (Sandbox Code Playgroud)

但请注意,您的代码还存在其他问题.