Algorithm 将数字拆分为三个带约束的桶

Algorithm 将数字拆分为三个带约束的桶,algorithm,probability,combinatorics,Algorithm,Probability,Combinatorics,有没有一个好的算法可以将随机生成的数字分成三个存储桶,每个存储桶都有关于它们可能包含的总数的限制 例如,假设我随机生成的数字是1000,我需要将其拆分为桶a、b和c These ranges are only an example. See my edit for possible ranges. Bucket a may only be between 10% - 70% of the number (100 - 700) Bucket b may only be between 10% -

有没有一个好的算法可以将随机生成的数字分成三个存储桶,每个存储桶都有关于它们可能包含的总数的限制

例如,假设我随机生成的数字是1000,我需要将其拆分为桶a、b和c

These ranges are only an example. See my edit for possible ranges.
Bucket a may only be between 10% - 70% of the number (100 - 700)
Bucket b may only be between 10% - 50% of the number (100 - 500)
Bucket c may only be between 5% - 25% of the number (50 - 250)
a + b + c must equal the randomly generated number 
你希望分配的数量是完全随机的,因此除了三个桶都在其平均百分比附近的可能性相同外,桶a达到其最大值的可能性与桶c相同

编辑:以下最有可能始终正确:a+b+c的低端<100%,a+b+c的高端>100%。这些百分比仅表示a、b和c的可接受值。如果a为10%,而b和c为最大值(分别为50%和25%),则必须重新分配数字,因为总数不等于100%。这正是我试图通过找到一种方法在一次传递中分配这些数字来避免的情况


我想找到一种方法,在一次传递中随机选取这些数字。

更新:是的,你是对的,结果不是均匀分布的

假设你的百分比值是自然数(如果这个假设是错误的,你不需要进一步阅读:),在这种情况下,我没有解决方案)

让我们将事件
e
定义为3个值(每个bucket的百分比)的元组:e=(pa,pb,pc)。接下来,创建所有可能的事件。这里有一个元组空间,由离散数量的事件组成。所有可能发生的事件应具有相同的发生可能性

假设我们有一个函数f(n)=>en。然后,我们所要做的就是取一个随机数n,在一次传递中返回en

现在,创建这样一个函数仍然是一个问题。
f
:)

在伪代码中,一种非常慢的方法(仅用于说明):

你们所知道的是一个单程解决方案,但问题只是被转移了。函数f非常慢。但是您可以做得更好:我认为如果您正确设置范围并计算偏移量,而不是迭代范围,那么您可以更快地计算所有内容

这够清楚吗


首先,你可能需要调整你的射程。桶
a
中的10%是不可能的,因为您无法使条件
a+b+c=number
保持

关于您的问题:(1)在您的范围内为bucket
a
选择一个随机数,然后(2)使用最小和最大百分比更新bucket
b
的范围(您应该只缩小范围)。然后(3)为bucket
b
选择一个随机数。最后,
c
应该计算出你的条件成立(4)

例如:

    n = 1000
(1) a = 40%
(2) range b [35,50], because 40+35+25 = 100%
(3) b = 45%
(4) c = 100-40-45 = 15%
或:


检查所有事件是否均匀分布。如果这是一个问题,您可能希望在步骤2中随机化范围更新。

该问题相当于在N维对象(在您的示例中为N=3)中选择一个随机点,该对象由方程(在您的示例中)定义:


0.1如果我们选择第一个桶的10%,那么我们可以得到的最大数量是(10%+50%+25%)*x=初始数量的85%。所以a+b+c不能保持。抱歉,这不清楚。我已经更新了帖子。问题是如果x和y都是0.1。这意味着z必须是0.8,这超出了它的可接受范围。我已经更新了这个问题,以解决a为10%的可能性和问题。
    n = 1000
(1) a = 40%
(2) range b [35,50], because 40+35+25 = 100%
(3) b = 45%
(4) c = 100-40-45 = 15%
    n = 1000
(1) a = 70%
(2) range b [10,25], because 70+25+5 = 100%
(3) b = 20%
(4) c = 100-70-20 = 10%
0.1  <= x  <= 0.7
0.1  <= y  <= 0.5
0.05 <= z  <= 0.25
x + y + z   = 1 (*)
0.1 <= x  <= 0.7
0.1 <= y  <= 0.5
0.05 <= (1 - x - y) <= 0.25 (**)