如何从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)
我需要从 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)