I think you can pass a position in the audio in the play
function in the AudioPlayer3D. I think the following code should work (untested though):
$AudioStreamPlayer3D.play(randf() * $AudioStreamPlayer.stream.get_length())
Edit: For looping, you can either set the audio stream to loop by setting looping
in the audio file importer, or you can use the finished
signal of the AudioStreamPlayer3D to tell if the audio player is done playing and call play()
when the signal is received.