Tuesday, June 5, 2012

Poker Hand Probabilities using nCr


'Poker probabilities - ZFS003-0
'Harry Hardjono
'May 2012
'
' Verified: Royal Flush, Flush
'I wonder why the probabilities don't match?
'
'
'All cards possibilities
S=52*51*50*49*48
TextWindow.WriteLine("All Card Possibilities: "+S)


'Royal Flush
P=20*4*3*2*1
TextWindow.WriteLine("Royal Flush:     1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Straight Flush
P=32*4*3*2*1
TextWindow.WriteLine("Straight Flush:  1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Four of a Kind
P=52*3*2*1*48
TextWindow.WriteLine("Four of a Kind:  1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Full House
P=52*3*2*48*3
TextWindow.WriteLine("Full House:      1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Flush
P=52*12*11*10*9
TextWindow.WriteLine("Flush:           1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Straight
P=52*16*12*8*4
TextWindow.WriteLine("Straight:        1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Three of a Kind
P=52*3*2*48*44
TextWindow.WriteLine("Three of a Kind: 1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Two Pair
P=52*3*48*3*44
TextWindow.WriteLine("Two Pair:        1 in "+Math.Round(S/P)+"       "+(P*100/S))


'One Pair
P=52*3*48*44*42
TextWindow.WriteLine("One Pair:        1 in "+Math.Round(S/P)+"       "+(P*100/S))


'High Card
P=52*48*44*42*38
TextWindow.WriteLine("High Card:       1 in "+Math.Round(S/P)+"       "+(P*100/S))


TextWindow.WriteLine(" ")
TextWindow.WriteLine("These combinations are verified on Wiki")


'Combination
N=52
R=5
nCr()
S=C
TextWindow.WriteLine("Combination:  "+C+"       ")


'Royal Flush
N=4
R=1
nCr()
TextWindow.WriteLine("Royal Flush:     1 in "+Math.Round(S/C)+"       "+(C*100/S))


'Straight Flush
ArrN="1=10;2=4;3=4;"
ArrR="1=1;2=1;3=1;"
MultinCr()
P=(ArrC[1]*ArrC[2])-ArrC[3]
TextWindow.WriteLine("Straight Flush:  1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Four of a Kind
ArrN="1=13;2=12;3=4;"
ArrR="1=1;2=1;3=1;"
MultinCr()
P=(ArrC[1]*ArrC[2]*ArrC[3])
TextWindow.WriteLine("Four of a Kind:  1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Full House
ArrN="1=13;2=4;3=12;4=4;"
ArrR="1=1;2=3;3=1;4=2;"
MultinCr()
P=(ArrC[1]*ArrC[2]*ArrC[3]*ArrC[4])
TextWindow.WriteLine("Full House:      1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Flush
ArrN="1=13;2=4;3=10;4=4;"
ArrR="1=5;2=1;3=1;4=1;"
MultinCr()
P=(ArrC[1]*ArrC[2])-(ArrC[3]*ArrC[4])
TextWindow.WriteLine("Flush:           1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Straight
ArrN="1=10;2=4;3=10;4=4;"
ArrR="1=1;2=1;3=1;4=1;"
MultinCr()
P=(ArrC[1]*ArrC[2]*ArrC[2]*ArrC[2]*ArrC[2]*ArrC[2])-(ArrC[3]*ArrC[4])
TextWindow.WriteLine("Straight:        1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Three of a Kind
ArrN="1=13;2=4;3=12;4=4;"
ArrR="1=1;2=3;3=2;4=1;"
MultinCr()
P=(ArrC[1]*ArrC[2]*ArrC[3]*ArrC[4]*ArrC[4])
TextWindow.WriteLine("Three of a Kind: 1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Two Pair
ArrN="1=13;2=4;3=11;4=4;"
ArrR="1=2;2=2;3=1;4=1;"
MultinCr()
P=(ArrC[1]*ArrC[2]*ArrC[2]*ArrC[3]*ArrC[4])
TextWindow.WriteLine("Two Pair:        1 in "+Math.Round(S/P)+"       "+(P*100/S))


'One Pair
ArrN="1=13;2=4;3=12;4=4;"
ArrR="1=1;2=2;3=3;4=1;"
MultinCr()
P=(ArrC[1]*ArrC[2]*ArrC[3]*ArrC[4]*ArrC[4]*ArrC[4])
TextWindow.WriteLine("One Pair:        1 in "+Math.Round(S/P)+"       "+(P*100/S))


'High Card
ArrN="1=13;2=10;3=4;4=4;"
ArrR="1=5;2=1;3=1;4=1;"
MultinCr()
P=(ArrC[1]-ArrC[2])*(ArrC[3]*ArrC[3]*ArrC[3]*ArrC[3]*ArrC[3]-ArrC[4])
TextWindow.WriteLine("High Card:       1 in "+Math.Round(S/P)+"       "+(P*100/S))








Sub MultinCr
  For m=1 To Array.GetItemCount(ArrN)
    N=ArrN[m]
    R=ArrR[m]
    nCr()
    ArrC[m]=C
    EndFor
endsub
  


'nCr = (n!)/(r!*(n-r)!)
Sub nCr
  'N (input)
  'R (input)
  C=1 '(output)
  For i=Math.Max(R,(N-R))+1 To N
    C=C*i
  EndFor
  For i=1 To Math.Min(R,(N-R))
    C=C/i
  EndFor
EndSub


  
TextWindow.WriteLine(" ")
TextWindow.WriteLine("These combinations are verified on Wiki")


'Combination
N=52
R=5
nCr2()
S=C
TextWindow.WriteLine("Combination:  "+C+"       ")


'Royal Flush
N=4
R=1
nCr2()
TextWindow.WriteLine("Royal Flush:     1 in "+Math.Round(S/C)+"       "+(C*100/S))


'Straight Flush
ArrN="1=10;2=4;3=4;"
ArrR="1=1;2=1;3=1;"
MultinCr2()
P=(ArrC[1]*ArrC[2])-ArrC[3]
TextWindow.WriteLine("Straight Flush:  1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Four of a Kind
ArrN="1=13;2=12;3=4;"
ArrR="1=1;2=1;3=1;"
MultinCr2()
P=(ArrC[1]*ArrC[2]*ArrC[3])
TextWindow.WriteLine("Four of a Kind:  1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Full House
ArrN="1=13;2=4;3=12;4=4;"
ArrR="1=1;2=3;3=1;4=2;"
MultinCr2()
P=(ArrC[1]*ArrC[2]*ArrC[3]*ArrC[4])
TextWindow.WriteLine("Full House:      1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Flush
ArrN="1=13;2=4;3=10;4=4;"
ArrR="1=5;2=1;3=1;4=1;"
MultinCr2()
P=(ArrC[1]*ArrC[2])-(ArrC[3]*ArrC[4])
TextWindow.WriteLine("Flush:           1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Straight
ArrN="1=10;2=4;3=10;4=4;"
ArrR="1=1;2=1;3=1;4=1;"
MultinCr2()
P=(ArrC[1]*ArrC[2]*ArrC[2]*ArrC[2]*ArrC[2]*ArrC[2])-(ArrC[3]*ArrC[4])
TextWindow.WriteLine("Straight:        1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Three of a Kind
ArrN="1=13;2=4;3=12;4=4;"
ArrR="1=1;2=3;3=2;4=1;"
MultinCr2()
P=(ArrC[1]*ArrC[2]*ArrC[3]*ArrC[4]*ArrC[4])
TextWindow.WriteLine("Three of a Kind: 1 in "+Math.Round(S/P)+"       "+(P*100/S))


'Two Pair
ArrN="1=13;2=4;3=11;4=4;"
ArrR="1=2;2=2;3=1;4=1;"
MultinCr2()
P=(ArrC[1]*ArrC[2]*ArrC[2]*ArrC[3]*ArrC[4])
TextWindow.WriteLine("Two Pair:        1 in "+Math.Round(S/P)+"       "+(P*100/S))


'One Pair
ArrN="1=13;2=4;3=12;4=4;"
ArrR="1=1;2=2;3=3;4=1;"
MultinCr2()
P=(ArrC[1]*ArrC[2]*ArrC[3]*ArrC[4]*ArrC[4]*ArrC[4])
TextWindow.WriteLine("One Pair:        1 in "+Math.Round(S/P)+"       "+(P*100/S))


'High Card
ArrN="1=13;2=10;3=4;4=4;"
ArrR="1=5;2=1;3=1;4=1;"
MultinCr2()
P=(ArrC[1]-ArrC[2])*(ArrC[3]*ArrC[3]*ArrC[3]*ArrC[3]*ArrC[3]-ArrC[4])
TextWindow.WriteLine("High Card:       1 in "+Math.Round(S/P)+"       "+(P*100/S))








Sub MultinCr2
  For m=1 To Array.GetItemCount(ArrN)
    N=ArrN[m]
    R=ArrR[m]
    nCr2()
    ArrC[m]=C
    EndFor
endsub
  


'nCr = (n!)/(r!*(n-r)!)
Sub nCr2
  'N (input)
  'R (input)
  C=N '(output)
  For i=2 To Math.Min(R,(N-R))
    C=C*(N-(i-1))/i
  EndFor
EndSub

No comments: