I pronounce if functional enough, when you use splice. Clearly, splice could be written as a separate function. (I could probably do that.) I would further golf #2 into
sub functional_FY {
return @_ ? ( splice( @_, rand @_, 1 ), &functional_FY ) : @_;
}
which is, I think, something of an improvement as well. Splicing the only element out of an array is certainly valid.
Update: A functional splice, though, shouldn't have side-effects. It would either retrieve the values, or return the array without them. Or you could make one that sticks them on the front, maybe. I pronounce it a good start.
Caution: Contents may have been coded under pressure.