分享

如何生成多个随机数,且满足它们的和为定值

 EXCEL分享 2020-11-13


 前言

前面讲了鸡兔同笼问题,还算简单,只有一个唯一的答案,下面这种场景在各个qq群问的比较多,那就是随机数的问题,今天就给大家详细解说一下:

如下面的表格,有四个数a1-a4,各自的区间如下表所示,请问如何分配a1-a4,使4个数的和为100

参数

a1

a2

a3

a4

最小值

0

10

25

45

最大值

10

25

45

70

这个问题如果用公式基本没法做,但是用VBA就容易多了.

 原理

我们可以随机生成4个数,每个数在各自的区间内,先假设都为整数,然将4个数加起来,判断是否等于100,如果等于100,则符合我们的要求,就把它写在单元格中,否则继续判断,直到找到我们要求的个数.

 具体操作

VBA,生成随机数,首先要初始化随机数种子,命令为Randomize,然后用Rnd函数生成一个01之间的随机数(包含0,但不包括1)

如果要生成一个介于ab之间的整数(a<b,且均为整数),可以这样表达

Int(a+(b-a+1)*Rnd()),这个表达式会生成一个包含ab以及他们之间的随机整数

 为了简化程序,我们把b-a+1直接在EXCEL表中计算出来.

参数

a1

a2

a3

a4

最小值

0

10

25

45

最大值

10

25

45

70

最大值-最小值+1

11

16

21

26

打开vba编辑器,下入下列代码:

Sub 随机数()

Randomize

n = 1 '初始化随机次数

i = 5 '从哪一行写入

Do While n <= 10 '生成10批随机数后停止

'生成随机数

a1 = Int(Cells(2, 2) + Cells(4, 2) * Rnd())

a2 = Int(Cells(2, 3) + Cells(4, 3) * Rnd())

a3 = Int(Cells(2, 4) + Cells(4, 4) * Rnd())

a4 = Int(Cells(2, 5) + Cells(4, 5) * Rnd())

If a1 + a2 + a3 + a4 = 100 Then '判断和是否等于100

Cells(i, 1) = "随机" & n '行标题

 '将符合要求的随机数写入单元格

Cells(i, 2) = a1

Cells(i, 3) = a2

Cells(i, 4) = a3

Cells(i, 5) = a4

'每匹配成功一次,次数加一,行数加一

i = i + 1

n = n + 1

End If

Loop

End Sub

运行程序,结果如下,我们随机生成了10组结果,每一组的和均为100.,当然你可以生成任意组,只需要改一下参数就行了。

参数

a1

a2

a3

a4

最小值

0

10

25

45

最大值

10

25

45

70

最大值-最小值+1

11

16

21

26

随机1

7

19

25

49

随机2

8

10

28

54

随机3

6

12

30

52

随机4

0

15

27

58

随机5

8

13

26

53

随机6

8

12

28

52

随机7

0

17

27

56

随机8

1

23

31

45

随机9

5

20

25

50

随机10

7

10

27

56

 知识点

循环语句:

Do WHILE

…….

LOOP

随机数:

Rnd()

根据范围生成随机数公式

对于其他的随机数大家可以举一反三,做到触类旁通.

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多