如何从集合中生成随机数(1,2,3,4,5,6),加起来N并遵循Java中的概率分布(0.3,0.25,0.25,0.1,0.05,0.05) ?
更新:我可以使用this answer中建议的EnumeratedIntegerDistribution,但这并没有考虑到这些数字应该加起来为N.
答案 0 :(得分:1)
这是integer partitions更常见问题的一个有趣变体。
生成N的整数分区相对简单,因此您有一组整数列表,它们总和为N.我的想法是,您可以根据指定分布中的概率为每个此类分区分配概率。然后根据计算的每分区概率从分区集合中进行采样。我认为每分区概率应该只是其元素概率的乘积。
这个方案适用于N,它不是太大 - 否则分区太多了。如果分区列表太大,不知道该怎么办。为了比较,60的整数分区数量略少于一百万(实际上是966467)。
我认为你可以使用拒绝抽样方案:从分区列表中选择一个(具有统一概率)。然后生成0到1之间的随机数,并查看该分区的计算概率。如果随机数小于计算的概率,则取该分区。否则再试一次;继续尝试,直到你拿一个。
我觉得可能只是乘以每个元素的概率是不正确的。这将使长分区的概率比短分区小得多;我不知道这是不对的。也许你可以想出一种不同的方法来为分区分配概率。
编辑:可能将每元素概率的乘积除以最大的此类乘积(因此其中一个接受概率为1,其余概率较小)。
EDIT2:我认为上面的方案可行,但每分区概率需要乘以多项系数(即n!/(n1!n2!... nm!),其中n =分区长度和n1,...,nm是分区中m个不同元素的编号。
但也许一个更简单的方案可行:生成随机数,而总和小于N.如果它恰好是N则返回该列表。如果没有,随机删除元素(从列表中的任何位置),直到总和小于N,然后再次开始添加元素。