【发布时间】:2017-10-11 11:04:45
【问题描述】:
sizes :: StdGen -> Int -> Int -> [Int]
sizes g c 0 = []
sizes g c b = a : (sizes g' (c - a) (b - 1)) where
(a, g') = randomR (1, c - b) g
main = do
g <- newStdGen
print $ sizes g 100 10
我已经把这个问题归结为生成随机数列表的问题,这些随机数总和为某个数字。
这段代码基本上可以工作,但数字似乎分布不均(例如[7,46,3,4,26,8,1,2,1,1])。
它们往往一开始就很大,然后最终变得更小。从代码中可以看出原因。
我想要的是像[8, 6, 10, 4, 15..] 这样的数字彼此之间并没有那么不同。
【问题讨论】:
-
我还不完全清楚你在问什么。让我提出一些你可能会问的事情,看看你的想法。您可能要求从给定数量和给定大小的partitions 集合中随机均匀地绘制。或者您可能会要求从一组方法中随机均匀地绘制,以将给定数量的(未标记的)球放入给定数量的(标记的)盒子中。 (...或其他三种变体,其他选择标记/未标记的盒子和球。)
-
请参阅stackoverflow.com/a/31814348/2166798 以获得可能的答案。实现是 Python,但算法很简单。
-
(想一想,可能从分区中均匀选择与从将未标记的球放入未标记的盒子的方式中均匀选择相同,直到对参数进行一些重新调整。)
-
@pjs 是的,这就是我想要的。你能解释一下为什么差异加起来是
n吗? -
@user1685095 因为范围[0,n]的总长度是n,区别就像棍子(或绳子,或尺子)的长度,放在末端时会跨越整个范围- 到结束。