如何从excel中的不同区间生成随机数,这些随机数加起来为固定总和?

How to generate random numbers from different intervals that add up to a fixed sum in excel?

我需要从 13 个不同的区间生成 13 个数字,这些数字加起来就是 1360。在下图中,"index" 表示 13 个不同数字的索引。均值表示间隔的均值(平均值)。范围将是平均值的正负 15%,如下所示。 我更愿意根据正态分布生成随机数,N(平均值,平均值的 7.5%)。我收回。没有正态分布。请使用 +- 15% 作为间隔的硬限制。

如果有人能在 excel 中弄清楚如何做到这一点,那就太好了。算法也会受到赞赏。

Index      mean    15%     low    high

  A        288     43      245    331
  B        50      8       43     58
  C        338     51      287    389
  D        50      8       43     58
  E        16      2       14     18
  F        66      10      56     76
  G        118     18      100    136
  H        17      3       14     20
  I        91      14      77     105
  J        26      4       22     30
  K        117     18      99     135
  L        165     25      140    190
  M        18      3       15     21

这样得到随机数

num = Int ((300 - 200 + 1) * Rnd + 200) //between 200 and 300

Click here for more information

并且随机数需要是总和减去你已经得到的总和,剩下的就是最后一个。

例如:(如果我们有 4 个数字总和为 100)

A is a random number between 0 to 100 //lets say 42
then B is a random number between 0 to (100-42) => 0 to 78 //lets say 18
then C is a random number between 0 to (100-42-18) => 0 to 40 //lets say 25
then, in the end D is 100-42-18-25 => D is 15

*100-42-18-25 is the same as 100-Sum(A,B,C) 

这是我的例子,根据低和高生成随机数。

column F中的公式就是RANDBETWEEN:

=RANDBETWEEN($D2,$E2)

然后你可以得到结果总是等于 1360 用下面的公式 column G:

=F2/SUM($F:$F)*1360

因此 cell G15 将始终为 1360,这是所有这 13 个间隔的总和。

我会通过递增均值对 table 进行排序:

并使用一列作为辅助值(上面的 H 列)。

这个想法是在进入下一行时保持当前与最终目标的完美目标的偏差。完美意味着每个随机值都与该行的平均值一致。如果某个值比平均值小 2,则该 2 将出现在下一行的 H 列中。为下一行生成的随机数将不会针对给定的均值,而是针对比均值小 2 的值。随机数的范围将适当缩小,这样 low/high 值就不会被越过。

通过首先对行进行排序,我们可以确定这个校正后的平均值将始终落在下一行的 low/high 范围内,因此总是可以生成一个 acceptable 随机数那里的号码。

最终值的计算方式不同:它将是实现目标总和所需的余数。同上,这个值保证在low/high范围内。

使用的公式如下:

   |                       F                          |              H
 --+--------------------------------------------------+------------------------------
 2 | =RANDBETWEEN(D2, E2)                             |
 3 | =RANDBETWEEN(B3+H3-C3+ABS(H3), B3+H3+C3-ABS(H3)) | =SUM($B:$B2)-SUM($F:$F2)
 4 |      (copy above formula)                        | (copy above formula)
...|              ...                                 |         ...
13 |      (copy above formula)                        | (copy above formula)
14 | =SUM($B:$B14)-SUM($F:$F13)                   |

理论上,行不需要排序,但是公式不能像上面那样复制下来,但必须引用正确的行。那会使它变得相当复杂。

如果绝对有必要按索引列(A、B、C...)的顺序显示行,则使用另一个 sheet 来执行上述操作。然后在主 sheet 中使用另一个 sheet 的 VLOOKUP 将值读入 F 列。所以在 F2 中你将有:

=VLOOKUP(A2, OtherSheet!$A:$F, 6, 0)