前言前面讲了鸡兔同笼问题,还算简单,只有一个唯一的答案,下面这种场景在各个qq群问的比较多,那就是随机数的问题,今天就给大家详细解说一下: 如下面的表格,有四个数a1-a4,各自的区间如下表所示,请问如何分配a1-a4,使4个数的和为100
这个问题如果用公式基本没法做,但是用VBA就容易多了. 原理我们可以随机生成4个数,每个数在各自的区间内,先假设都为整数,然将4个数加起来,判断是否等于100,如果等于100,则符合我们的要求,就把它写在单元格中,否则继续判断,直到找到我们要求的个数. 具体操作在VBA中,生成随机数,首先要初始化随机数种子,命令为Randomize,然后用Rnd函数生成一个0到1之间的随机数(包含0,但不包括1) 如果要生成一个介于a到b之间的整数(a<b,且均为整数),可以这样表达 Int(a+(b-a+1)*Rnd()),这个表达式会生成一个包含a和b以及他们之间的随机整数 为了简化程序,我们把b-a+1直接在EXCEL表中计算出来.
打开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.,当然你可以生成任意组,只需要改一下参数就行了。
知识点循环语句: Do WHILE ……. LOOP 随机数: Rnd() 根据范围生成随机数公式 对于其他的随机数大家可以举一反三,做到触类旁通. |
|