#Pyth, 53 bytes
u+GO?H+W<K/G\B3+W<Jl@"SF"G2\F\S\B+WqK3+WgJ2\H\S\B_UQ[
Try it online here.
This feels way too long, I think another approach may be required.
u+GO?H+W<K/G\B3+W<Jl@"SF"G2\F\S\B+WqK3+WgJ2\H\S\B_UQ[ Implicit: Q=eval(input())
_UQ Reversed range from Q-1 to 0
u [ Reduce the above, with initial value G=[], next value as H:
@"SF"G Keep elements of G which are in "SF"
l Length of the above
J Store in J - this is the number of strikes and fouls so far
/G\B Count number of "B"s in G
K Store in K - this is the number of balls so far
?H If H is not 0 (i.e. not final pitch):
\F Start with "F" (foul is always available in non-final pitch)
W<J 2 If J<2...
+ \S ... append "S"
W<K 3 If K<3...
+ \B ... append "B"
Else:
\H Start with "H" (hit is always available in final pitch)
WgJ2 If J >= 2...
+ \S ... append "S"
WqK3 If K == 3...
+ \B ... append "B"
O Choose one element at random from the available options
+G Append the above to G
Implicit print the result of the reduce operation