在某些代码中,我想选择总和为的n随机数.[0,1)1
我这样做是通过单独选择数字[0,1)并通过将每个数字除以总和来标准化它们:
numbers = [random() for i in range(n)]
numbers = [n/sum(numbers) for n in numbers]
Run Code Online (Sandbox Code Playgroud)
我的"问题"是,我得出的分布是相当偏斜的.选择一百万个数字而不是一个数字就可以了1/2.通过一些努力,我已经计算了pdf,这并不好.
这是我为5个变量得到的奇怪的pdf:

您是否有一个好的算法来选择数字,从而产生更均匀或更简单的分布?
我想生成一个包含26个随机整数的列表,其与Haskell的总和为301.我写了以下内容:
import System.Random
f 1 sum = [sum]
f n sum = m : (f (n-1) (sum-m))
where m = randomRIO (0,sum)
Run Code Online (Sandbox Code Playgroud)
但它无法编译!我对IO很困惑!
Occurs check: cannot construct the infinite type: a1 = IO a1
In the first argument of `(:)', namely `m'
In the expression: m : (f (n - 1) (sum - m))
In an equation for `f':
f n sum
= m : (f (n - 1) (sum - m))
where
m = randomRIO (0, sum)
Run Code Online (Sandbox Code Playgroud)