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.