2013-05-31 54 views
1

基本上我有一個數組A = Array(1, 2, 3, 4, 5)我想要做的是,使用Rnd(),根據隨機數的值繞着這個循環。分段函數和打印結果到單元格VBA

基本上從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代碼。

回答

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 
級數
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 

這給我我想要的。不過,我現在希望,一些明亮的火花可以隱藏一個更好的方法,不涉及我總是教過的循環,應儘可能地避免。