VBA coding - 生成随机变量

VBA coding - Generating Random Variable

我想把代码写成VBAexcel。我已经准备了如下所示的算法,但我不知道我将如何在 VBA 中编写它:/ 有人可以帮我解决这个问题吗?

1)赋初值:Current为1,Year为0,Result为空串。

2) 从U(0,1)生成一个随机变量u;

3) 如果Current为1,且u≤0.23,则将0赋值给Current。如果 Current 为 0,并且 u > 0.86,则将 1 分配给 Current。否则什么都不做。

4) 将 Year 增加 1。在 Result 字符串的末尾写入 Current。

5) 如果 Year 小于 cell("A2").value,则转到步骤 (2)。否则 return 结果

这会将您的英语翻译成 VBA

Sub Jona()
   Dim Current As Long, Yearr As Long
   Dim u As Double, Result As String

   Current = 1
   Yearr = 0

   While Yearr < Range("A2").Value
      u = Rnd()
      If Current = 1 And u <= 0.23 Then
         Current = 0
      ElseIf Current = 0 And u > 0.86 Then
         Current = 1
      End If
      Yearr = Yearr + 1
      Result = Result & Current
   Wend

   MsgBox Result
End Sub

这是一个可以直接在电子表格上使用的 UDF(user-defined 函数):

Function Chain(years As Long) As String
    Dim i As Long, result As String
    Dim u As Single
    Dim current As Long

    Randomize
    Application.Volatile

    current = 1
    For i = 1 To years
        u = Rnd()
        If (current = 1 And u <= 0.23) Or (current = 0 And u > 0.86) Then
            current = 1 - current
        End If
        result = result & current
    Next i
    Chain = result
End Function

year 只是一个计数器,您的算法实际上描述了一个简单的 for-loop。在 VBA 中,对于一个简单的计数器来说,从 1 循环到 n 比从 0 循环到 n-1 更符合习惯——尽管这主要是个人喜好问题。另外——我将 year 更改为 i 以防止意外隐藏 built-in 函数 year()

VBA 具有变量的自然默认值,因此我不需要显式初始化 result.

我创建了函数 volatile -- 所以它会在电子表格执行时重新计算。这与 RAND() 在 Excel 中的工作方式相匹配。如果你不想要那个——删除行 Application.Volatile.

截图: