UDF 随机数生成器类型不匹配

Posted

技术标签:

【中文标题】UDF 随机数生成器类型不匹配【英文标题】:UDF Random Number Generator Type Mismatch 【发布时间】:2018-11-07 18:17:54 【问题描述】:

我已经尝试了将近一个小时来解决这个问题,但似乎无济于事。

基本上我想尝试一个更好的随机数生成器,并找到了我想在我的程序中实现的代码

 Function RandNorm(Optional mean As Double = 0, _
              Optional Dev As Double = 1, _
              Optional Corr As Double = 0, _
              Optional bVolatile As Boolean = False) As Double()


Randomize
Dim z(0 To 1)   As Double
Dim U           As Double
Dim V           As Double
Dim S           As Double

If bVolatile Then Application.Volatile

Do
    U = 2 * [rand()] - 1
    V = 2 * [rand()] - 1
    S = U * U + V * V
Loop Until S < 1

S = Sqr(-2 * Log(S) / S)
z(0) = Dev * U * S + mean
z(1) = Dev * V * S + mean

If Corr <> 0 Then z(1) = Corr * z(0) + Sqr(1 - Corr ^ 2) * z(1)
RandNorm = z
End Function

如您所见,该函数返回一个数字。在 Excel 中运行时,如=RandNorm(),一切都很好。但是当运行时,例如这样一个简单的代码:

 Sub test()

    Dim x() As Double, i As Long

    ReDim x(1 To 10, 1 To 1)
    For i = 1 To 10
          x(i, 1) = RandNorm
    Next i

    Range("A1:A10") = x
End Sub

它给了我“类型不匹配”错误,尽管它已被定义为As Double。 如果我在Sub 中定义RandNorm As Double,它会给我0。 但是,如果我将x(i, 1) 替换为Cells(i, 1),它可以工作。

函数在它自己的Module和Sub中。

我错过了什么?任何帮助将非常感激。提前致谢!

【问题讨论】:

【参考方案1】:

DoubleDouble() 不同:RandNorm 返回一个数组。当在单个单元格中用作 UDF 时,RandNorm 返回该数组的 first 元素。例如,考虑以下函数。

Function foo() As Double()
    Dim z(0 To 1) As Double
    z(0) = 1
    z(1) = 2
    foo = z
End Function

当在单个单元格中用作 UDF 时,=foo() 将始终返回 1。您需要使用 Ctrl+Shift+Enter 将其作为数组公式输入到 2 个单元格中,以显示第二个元素 2

简单的解决方法可能是将Double() 更改为Double 并将RandNorm = z 更改为RandNorm = z(0)

Function RandNorm(Optional mean As Double = 0, _
              Optional Dev As Double = 1, _
              Optional Corr As Double = 0, _
              Optional bVolatile As Boolean = False) As Double
    ....
    If Corr <> 0 Then z(1) = Corr * z(0) + Sqr(1 - Corr ^ 2) * z(1)
    RandNorm = z(0)
End Function

虽然很难说这就是你要找的东西 - 因为你实际上忽略了z(1)

【讨论】:

哦哦,这行得通!可耻的是,我将 As Double() 误读为 As Double)。我认为这是括号内声明的一部分。谢谢大本。这是一个非常有用的后见之明。 @SirChristopherMcFarlane 一点也不羞耻。很高兴为您提供帮助

以上是关于UDF 随机数生成器类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

生成不重复的随机数

论 Java 中获取一组不重复的随机数之性能问题

Java连载81-枚举类型,生成五个不重复的随机数,集合简介

JS中字符串操作,生成随机数,正则表达式

生成随机密码和邮箱手机匹配

Spark SQL - 非确定性 UDF 的单一评估