Haskell 如何将列表分成均匀随机的块? size::StdGen->Int->Int->[Int] 尺寸g c 0=[] 尺寸g c b=a:(尺寸g’(c-a)(b-1))其中 (a,g')=randomR(1,c-b)g main=do 我不太清楚你想做什么,但如果你想在最小值和最大值之间均匀分布,你可以使用randomRs: 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

Haskell 如何将列表分成均匀随机的块? size::StdGen->Int->Int->[Int] 尺寸g c 0=[] 尺寸g c b=a:(尺寸g’(c-a)(b-1))其中 (a,g')=randomR(1,c-b)g main=do 我不太清楚你想做什么,但如果你想在最小值和最大值之间均匀分布,你可以使用randomRs: 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,haskell,random,Haskell,Random,您可以开始浏览此列表,直到找到一个足够接近的列表,而不是取10。例如,您可以计算所有这些列表的总和: Prelude System.Random> :m +Data.List Prelude System.Random Data.List> take 10 $ inits $ randomRs (10, 100) g [[],[48],[48,93],[48,93,21],[48,93,21,50],[48,93,21,50,84],[48,93,21,50,84,57], [48,

您可以开始浏览此列表,直到找到一个足够接近的列表,而不是
取10
。例如,您可以计算所有这些列表的总和:

Prelude System.Random> :m +Data.List
Prelude System.Random Data.List> take 10 $ inits $ randomRs (10, 100) g
[[],[48],[48,93],[48,93,21],[48,93,21,50],[48,93,21,50,84],[48,93,21,50,84,57],
[48,93,21,50,84,57,25],[48,93,21,50,84,57,25,80],[48,93,21,50,84,57,25,80,68]]
所以,如果你的目标是,比如说,500,你可以看到第九个数字是458,而第十个数字太高了。换句话说,前九个数字将使您达到458。你怎样才能达到500

一种选择是简单地说,最后一个数字必须是500-458=42,但我不确定分布是否会再完全一致,因为最后一个数字是确定的

另一个选择是继续生成随机数,直到得到一个完美匹配的序列

因为我不知道确切的要求,我不能建议哪种方式最好


在上面的例子中,我使用
fmap sum
来说明我的观点。这样做的问题是,通过这样做,你扔掉了产生总和的数字。据我所知,你实际上想要这些数字,所以你可能需要一个更复杂的左折,既能计算和,又能记住产生和的数字。你可以使用
foldl
foldl'

我想要的是这个问题的第二个答案,它适合于处理整数而不是浮点数。我不知道如何才能更清楚地
生成随机数列表,并将其汇总成一些数字。例如,假设我有一个数字
10
,我需要三个整数,这三个整数加起来就是这个数字
[3,3,4]
,很抱歉,这是一个非常糟糕的解决方案。即使计算
100
的容量长度也需要很多时间。我的链接中的解决方案要好得多。你能帮助它适应haskell和整数吗?我想把浮点数分为整数和小数部分,它们以某种方式分配这些小数部分,这样结果的和就等于给定的数字。我还不完全清楚你在问什么。让我提出一些你可能会问的问题,看看你的想法。您可以要求从给定数字和给定大小的集合中均匀地随机抽取。或者,您可以要求从一组方法中均匀地随机抽取,将给定数量的(未标记的)球放入给定数量的(标记的)框中。(…或其他三种变体,以及盒子和球的其他标记/未标记选项。)有关可能的答案,请参阅。实现是Python,但算法很简单。(想想看,可能从分区中统一选择与从方法中统一选择相同,将未标记的球放入未标记的框中,直到重新调整参数。)@pjs是的,这就是我想要的。你能解释一下为什么差异加起来就是
n
?@user1685095,因为范围[0,n]的总长度是n,而这些差异就像棍子(或绳子或尺子)的长度一样,它们在端到端放置时跨越了整个范围。
Prelude System.Random> :m +Data.List
Prelude System.Random Data.List> take 10 $ inits $ randomRs (10, 100) g
[[],[48],[48,93],[48,93,21],[48,93,21,50],[48,93,21,50,84],[48,93,21,50,84,57],
[48,93,21,50,84,57,25],[48,93,21,50,84,57,25,80],[48,93,21,50,84,57,25,80,68]]
Prelude System.Random Data.List> fmap sum $ take 10 $ inits $ randomRs (10, 100) g
[0,48,141,162,212,296,353,378,458,526]