0

我目前拥有的:

Option Explicit

Function Triangular(a As Double, b As Double, c As Double) As Double

Randomize
Application.Volatile

Dim d As Double
Dim uniform As Double
Dim retval as Double 



d = (b - a) / (c - a)
    uniform = Rnd()

    If uniform <= d Then
    Triangular = a + (c - a) * Sqr(d * uniform)

Else

    Triangular = a + (c - a) * (1 - Sqr(1 - d) * (1 - uniform))

End If

End Function

我在 VBA 中创建三角分布函数时遇到了麻烦,该函数根据以下参数计算随机数:

  • 计算 d = ( b - a )/( c - a )

  • 使用 VBA 的 Rnd 函数生成一个介于 0 和 1 之间的均匀分布的随机数 U。

  • 如果 U <= d,则返回 a + ( c - a ) × sqr(d×U) 作为随机数。(Sqr(x) 是一个 VBA 函数,它返回 x 的平方根。

  • 如果 U > d ,则返回 a + ( c - a ) × (1 - sqr((1- d )×(1-U))) 作为随机数。

参数 a 和 c 分别是最小和最大可能值,参数 b 是最可能的值(您可以看到三角形中的高点)。

我不确定如何创建此功能,并且想知道是否有人可以伸出援手?在处理函数时,我意识到我需要使用 randomize 函数,以便在每次调用函数时不生成类似的结果,以及 application.volatile 操作。

4

3 回答 3

0

不确定生成方程的正确性。看看这里的正确方程式;不同之处在于bc相对于您的定义进行了切换。这是一个实现,将该页面的公式调整为您自己对 a、b 和 c 的定义:

Function Triangular(a As Double, b As Double, c As Double) As Double
    Application.Volatile
    Dim U As Double: U = Rnd()
    If U < (b - a) / (c - a) Then
      Triangular = a + sqrt(U * (b - a) * (c - a))
    Else
      Triangular = c - sqrt(U * (c - b) * (c - a))
    End If
End Function

要在新工作表中从上述分布生成序列,您可以

1-创建新工作表

2-在单元格中写下你的参数A1B1C1

3-把这个公式写在A2=Triangular($A$1, $B$1, $C$1)

4-复制/粘贴单元格A2向下列

于 2017-06-25T06:44:56.893 回答
0

请注意第二种情况下的(1-Prob)Wikipedia 链接显示了正确的公式,但 ASH 未正确实施

Function Triangular(ByVal Min As Single, ByVal ML As Single, ByVal Max As Single) As Single
    Application.Volatile
    Dim Prob As Single
    Prob = Rnd
    If Prob < (ML - Min) / (Max - Min) Then
      Triangular = Min + Sqr(Prob * (ML - Min) * (Max - Min))
    Else
      Triangular = Max - Sqr((1 - Prob) * (Max - ML) * (Max - Min))
    End If
End Function
于 2019-08-27T06:52:15.797 回答
0

您的代码中有错误。应该在第二个分支

Triangular = a + (c - a) * (1 - Sqr((1 - d) * (1 - uniform)))
于 2017-06-25T00:04:08.487 回答