如何使用随机数(带限制)在不使用求解器的情况下添加总和?

时间:2014-04-16 17:06:15

标签: excel

我的逻辑出现问题。我需要一组随机数来添加100.应用于数字的约束如下:

1号 - 介于20和80之间

2号 - 10到40之间

3号 - 5到20之间

我知道这可能很简单,但无法绕过它。

提前致谢。

3 个答案:

答案 0 :(得分:1)

这些计算何时需要执行? (因为它使用randomBetween重新计算每次单元格更改值。并且有可能出现第一个数字15-19。我试图找出如何使用宏来防止它。

enter image description here

答案 1 :(得分:1)

如果你这样做,那么E到G列就是你的随机数。 H列是一个检查,以确保在缩放后仍然满足您的约束。这对宏观解决方案的好处是计算效率,因为大约80%的尝试导致满足约束,而宏观方法仅产生略高于1%。当然,这种缩放逻辑可以在宏中完成,但这里是在工作表函数中。 enter image description here

编辑:看起来我的屏幕截图接近不可读,所以这里是第一行从左到右的公式......

=RANDBETWEEN(20,80)
=RANDBETWEEN(10,40)
=RANDBETWEEN(5,20)
=SUM(A1:C1)
=A1/($D1/100)
=B1/($D1/100)
=C1/($D1/100)
=IF(AND(E1>=20,F1<=80,G1>=5,G1<=20),1,0)

答案 2 :(得分:0)

如果一开始你没有成功......

简单.....只需运行这个小宏:

Sub randommm()
    Dim wf As WorksheetFunction
    Set wf = Application.WorksheetFunction
    zum = 0
    While zum <> 100
        v1 = wf.RandBetween(20, 80)
        v2 = wf.RandBetween(10, 40)
        v3 = wf.RandBetween(5, 20)
        zum = v1 + v2 + v3
        DoEvents
    Wend
    [A1] = v1
    [A2] = v2
    [A3] = v3
End Sub

修改#1

宏非常易于安装和使用:

  1. ALT-F11调出VBE窗口
  2. ALT-I ALT-M打开了一个新模块
  3. 粘贴内容并关闭VBE窗口
  4. 如果保存工作簿,宏将随之保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx

    删除宏:

    1. 按上述方式调出VBE窗口
    2. 清除代码
    3. 关闭VBE窗口
    4. 要使用Excel中的宏:

      1. ALT-F8
      2. 选择宏
      3. 触碰RUN
      4. 要了解有关宏的更多信息,请参阅:

        http://www.mvps.org/dmcritchie/excel/getstarted.htm

        http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

        必须启用宏才能使其正常工作

        修改#2

        删除旧宏并将其替换为:

        Sub randommm()
            Dim wf As WorksheetFunction
            Set wf = Application.WorksheetFunction
            For i = 1 To 1000
                zum = 0
                While zum <> 100
                    v1 = wf.RandBetween(20, 80)
                    v2 = wf.RandBetween(10, 40)
                    v3 = wf.RandBetween(5, 20)
                    zum = v1 + v2 + v3
                    DoEvents
                Wend
                Cells(i, 1) = v1
                Cells(i, 2) = v2
                Cells(i, 3) = v3
            Next i
        End Sub