分段功能和打印结果到单元格VBA

时间:2013-05-31 09:43:32

标签: function vba excel-vba logic excel

基本上我有一个数组A = Array(1, 2, 3, 4, 5)我想要做的是,使用Rnd(),根据随机数的值圈出这个循环。

基本上从0 Mod 5开始获取一个随机数。如果随机数小于0.5,那么我保持0 Mod 5,但是如果随机数大于或等于0.5,那么我移动到1 Mod 5,然后因为它被传递到下一阶段'它再次滚动',所以我向它传递一个新的随机数,看它是否可以到达2 Mod 5

我的目标是运行10,000次并在电子表格的A列中收集结果,然后绘制散点图以查看其工作原理。

现在我创建了一个函数

Function looper(R, i)
If R < 0.5 Then
    j = i
Else
    j = i + 1
End If
If j = i Then
    Exit Function
Else
    newR = Rnd()
    j = looper(newR, j)
End If
End Function

加上子

Sub loopy()
A = Array(1, 2, 3, 4, 5)
Randomize
R = Rnd()
k = looper(R, 1)
Cells(1, 1).Value = A(k Mod 5)

但是它只返回值1。

我很确定我在做一些根本错误的事情,无论是我的逻辑,还是我试图将我的逻辑放入VBA代码。

2 个答案:

答案 0 :(得分:1)

您是否正在尝试分析和/或破解在线轮盘逻辑? ;)


您的looper功能旨在始终返回1
即使随机数大于0.5,你也会以递归方式调用函数 - 因此,用简单的话说,它会重复,直到新的随机数小于0.5,如果是,则返回{{ 1}}。

所以我为你重写了这个,这段代码将打印出1的结果 - 在A栏中 它打印了它经过的阶段数

how many random numbers greater than 0.5 can I get in a row

答案 1 :(得分:0)

好的,所以我改变了我的功能

Function looper(i)
R = Rnd()
If R < 0.5 Then
    looper = i
Else
    looper = i + 1
End If
End Function

并改变了我的潜艇

Sub loopy()
A = Array(1, 2, 3, 4, 5)
Cells(1, 1).Value = "Number"
For i = 2 To 10001
    k = 1
    j = 1
    While k = j
        j = looper(k)
        k = k + 1
    Wend
    Cells(i, 1).Value = A(j Mod 5)
Next i
End Sub

这给了我想要的东西。我现在希望,一些明亮的火花可以让人想到一个更好的方法,不会涉及While循环,我应该尽可能避免使用{{1}}循环。