2014-08-29 65 views
0

我正在研究VBA中的賭博模擬,以確定輸贏概率中的變化將如何影響我的結果的標準偏差。在多次運行我的代碼後,我注意到我的Else參數被跳過,結果numtry總是等於1.失敗,勝利和嘗試都表示總計爲一的數字(失敗< 1,失敗+贏得< 1,失敗+ win + tryagain = 1)如果VBA中的循環忽略其他參數

這是我的代碼。

Sub game() 
Dim win, tryagain, prize, fail, numtries, winnings, roll As Integer 

prize = Sheets("Game 1").Cells(3, 1).Value 
win = Sheets("Game 1").Cells(5, 1).Value 
tryagain = Sheets("Game 1").Cells(7, 1).Value 
fail = Sheets("Game 1").Cells(9, 1).Value 

    winnings = 0 
    numtries = 1 

For i = 1 To 9999 

roll = Rnd() 

    If roll <= fail Then 
    winnings = 0 
    Exit For 

    ElseIf fail <= roll <= fail + win Then 
    winnings = prize * numtries 
    Exit For 

    Else 
    numtries = numtries + 1 
    End If 

    Next i 

Sheets("Game 1").Cells(15, 3).Value = winnings 
Sheets("Game 1").Cells(15, 4).Value = numtries 

End Sub 

謝謝!

+0

更新的答案,包括一些改動你的代碼。將兩個Subs都複製到VBA中,然後運行'runs2()'來運行'runs = 99',看看它在做什麼。我想你需要考慮'numtries'。 – 2014-08-30 01:05:43

+1

無關但友好的說明,只有「roll」是一個Integer,其餘的都是聲明爲Variant。你不能像你一樣鏈接昏暗,它必須像「昏暗的勝利作爲整數,滾動整數」等。 – aevanko 2014-08-30 01:48:10

回答

2

您可以通過調試您的應用程序(使用F8鍵單步執行VBA代碼)找到此信息。對於調試幫助,您確實應該指定代碼中所有變量的值,您正在使用的是什麼,以及您認爲正確的輸出應該是,以及您輸出的正在獲得的值。這樣別人就可以驗證你的代碼並確定正確的方法。

您定義roll爲整數,然後設置roll=Rnd(),但Rnd()float並返回一個數小於1這實際上意味着roll=1所有的時間。

我懷疑fail被定義爲一個百分比(或小數),這是< 1。這意味着你的條件

If roll <= fail總是FALSE

fail <= roll <= fail + win總是TRUE

其餘的問題,你應該可以從這裏解決。這有幫助嗎?

更新 這是一個實現和幫助函數,使事情變得更清晰一些。特別是,for i=1 to 9999循環已被激活,因爲它之前沒有運行(設置runs來更改循環次數)。

第一個輔助函數是PrintArray,用於將數組內容打印到工作表。將這兩個過程複製到您的VBA中。

Sub PrintArray(Data As Variant, Cl As Range) 
    Cl.Resize(UBound(Data, 1), UBound(Data, 2)) = Data 
End Sub 

而且game2()是你的代碼有輕微的更新:

Sub game2() 
Dim win, tryagain, prize, fail, winnings, roll As Double 
Dim ans() As Double 
Dim numtries, runs As Long 

'set variables start 
prize = Sheets("Game 1").Cells(3, 1).Value 
win = Sheets("Game 1").Cells(5, 1).Value 
tryagain = Sheets("Game 1").Cells(7, 1).Value 
fail = Sheets("Game 1").Cells(9, 1).Value 
runs = 99 'the number of loops 
'set variables finish 

ReDim ans(runs, 2) 

    winnings = 0 
    numtries = 1 

For i = 1 To runs 

    roll = Rnd() 

    Select Case roll 
     Case 0 To fail 
      winnings = 0 
     Case fail To (fail + win) 
      winnings = prize * numtries 
     Case Else 
      numtries = numtries + 1 'numtries only gets updated here.. 
    End Select 

    ans(i - 1, 0) = winnings 
    ans(i - 1, 1) = numtries 
Next i 

PrintArray ans, ActiveWorkbook.Worksheets("Game 1").[C15] 

End Sub 
+1

感謝您的迴應Rusan。 我看到這可能是一個問題,但我想提一提,roll <= fail即使在我將dim轉換爲整數時也會返回true。 我嘗試了暗光輥作爲變體,沒有發生變化 – Innovation 2014-08-30 00:15:21

+1

@Innovation OK。這排除了一些事情。但是請閱讀我關於發佈用於所有變量的所有信息和值等的意見......以及您期望的輸出和輸出。如果你不能這麼做,那麼很少有人會爲自己猜測而煩惱。例如,「失敗」的價值是什麼 - 你指的是你沒有顯示過的工作表單元格...... – 2014-08-30 00:29:25

+1

固定!調試技巧幫助了很多Rusan。我發現錯誤的線路和罪魁禍首 - 失敗<= roll <= fail + win不是一個合法的參數。 失敗<=擲骰子<=失敗+贏得順利! 將upvote,但沒有代表:( – Innovation 2014-08-30 00:35:41