Originally Posted by
Cacarulo
I apologize, I may have formulated the problem incorrectly. What I meant to ask is:
What is the probability of getting 2 or more consecutive heads in 4 tosses of a fair coin (p = 0.5)?
I'm just trying to see what value the iCNT code returns.
Sincerely,
Cac
So my code returns 0.0625 which is blatantly incorrect as the correct number is 0.3125 if we do exactly 2 consecutive heads or 0.5 if we do 2 or more consecutive heads (3 or 4 in this case). My code is an adaptation of de Moivre formula which works fairly well when the number of trials increases but fails for small number of trials.
I have of course looked at brute force combinatorial analysis but while the code is fairly simple, the calculation quickly becomes intractable as the number of trials increases because for n trials you have 2^n possible permutations, so you can kiss solving 7000 rounds (2^7000) good bye .
I was able to implement a fairly easy sim that reproduces the values. Below is the implementation in VBA if you want to test it in Excel. @Norm please dont hate me for using the built-in RNG
Code:
Sub TestMe()
Debug.Print ProbabilityOfStreak(2, 0.5, 4, 100000, True)
End Sub
Function ProbabilityOfStreak(l As Long, p As Double, n As Long, simulations As Long, allowLonger As Boolean) As Double
Dim streakCount As Long
Dim currentStreak As Long
Dim i As Long
Dim j As Long
Dim successfulSimulations As Long
successfulSimulations = 0
' Seed the random number generator
Randomize
' Randomly generate each trial and count the number of successful simulations with exactly one streak of length l
For i = 1 To simulations
currentStreak = 0
streakCount = 0
For j = 1 To n
If Rnd() < p Then
' Increment streak if the event occurs
currentStreak = currentStreak + 1
Else
' Check if the streak ended and was exactly length l or longer based on allowLonger flag
If (allowLonger And currentStreak >= l) Or (Not allowLonger And currentStreak = l) Then
streakCount = streakCount + 1
End If
currentStreak = 0
End If
Next j
' Check streak at the end of the trials
If (allowLonger And currentStreak >= l) Or (Not allowLonger And currentStreak = l) Then
streakCount = streakCount + 1
End If
' Check if exactly one streak of length l occurred
If streakCount = 1 Then
successfulSimulations = successfulSimulations + 1
End If
Next i
' Calculate probability based on sim results
ProbabilityOfStreak = successfulSimulations / simulations
End Function
Bookmarks