1

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

基本上从0 Mod 5得到一个随机数开始。如果随机数小于 0.5 则我0 Mod 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 代码的方式。

4

2 回答 2

1

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


您的looper函数旨在始终返回1
即使随机数大于0.5您递归调用该函数 - 所以,简单来说,它会重复直到新的随机数小于0.5,如果是,则返回1

所以我为你重写了这个,这段代码将打印出how many random numbers greater than 0.5 can I get in a row- 在 A 列中的结果。
它打印出它通过的阶段数

Option Explicit

Sub roulette()
    Dim ws As Worksheet, nextRow&, i&, max&
    Set ws = Sheets(1): ws.Cells.ClearContents
    For max = 1 To 10001
        nextRow = ws.Range("A" & Rows.Count).End(xlUp).Row + 1
        ws.Range("A" & max).Value = getStage
    Next max
End Sub

Function crack() As Boolean
    Dim x#: Randomize: x = Rnd()
    If x >= 0.5 Then crack = True
End Function

Function getStage() As Long
    Dim cnt&
    While crack: cnt = cnt + 1: Wend: getStage = cnt
End Function
于 2013-05-31T10:37:19.377 回答
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我一直被教导的循环,应该尽可能避免。

于 2013-05-31T10:14:24.857 回答