 Playing Card Probability

This example intends to answer the following question - what is the probability of getting 3 cards with red hearts and two other cards when 5 cards are drawn from a deck?

The trick is to assign a "1" to the 13 cards with red hearts and a "0" to the rest of the cards. On each iteration, 5 cards are drawn without replacement (please refer to the Lotto number generator example for this technique) and the numbers (0 and 1) associated with the 5 cards are summed up together. If the summed number is 3 then the program will add one to the counter. The probability would be the percentage between the numbers of counts and the number of iterations ran. The set of steps described above is a simulation process which can be applied to other scenarios as well. Please note that the probability of this particular scenario can be derived using the hypergeometric distribution which is shown below. The probability for this scenario should be 8.15%. The number of iterations should be at least 100,000 in order to obtain a comparable result. Figure 1, below, shows the result (7.19%) from a run of 500 iterations. The user can change the number of iterations on line 4 of the program. x = the number of successes in the sample. (3 red heart cards drawn)
n = the size of the sample. (5 cards drawn)
M = the number of successes in the population. (13 red cards)
N = the population size. (52 cards in a deck) 'Option Explicit
Option Base 1
Public jj As Long
Public Const iteration = 100000

'***********************************************************************
'*                                        Resampling Process                                    *
'***********************************************************************

Sub Resample()
Dim i As Long
Dim NumSum As Long
Dim counter As Long
Dim card(5) As Single
Dim hold(52) As Single, Hold2(52) As Single
Dim x(52) As Single, y(52) As Single

Randomize

For i = 1 To 13
Hold2(i) = 1
Next i

For i = 14 To 52
Hold2(i) = 0
Next i

counter = 0
For jj = 1 To iteration

For i = 1 To 52
hold(i) = Rnd
Next i

Call DoubleSort(52, hold, Hold2)

NumSum = 0
For i = 1 To 5
NumSum = NumSum + Hold2(i)
Next i

If NumSum = 3 Then counter = counter + 1
Cells(3, 3) = counter
Cells(4, 3) = jj

Next jj

Cells(5, 3) = counter / jj
End Sub

'***********************************************************************
'*                Sorting Process -  Sort array y based on array x              *
'***********************************************************************

Sub DoubleSort(n As Long, x() As Single, y() As Single)
Dim xTemp As Double
Dim yTemp As Double
Dim i As Long
Dim j As Long

For j = 2 To n

xTemp = x(j)
yTemp = y(j)
For i = j - 1 To 1 Step -1
If (x(i) <= xTemp) Then GoTo 10
x(i + 1) = x(i)
y(i + 1) = y(i)
Next i

i = 0
10          x(i + 1) = xTemp
y(i + 1) = yTemp

Next j

End Sub

VBA Codes 