@lacuna, so as not to junk up @Dizzy-Dizzy's topic, I wanted to continue investigating in a new topic. For some reason I woke up this morning with the realization that your [array random] strategy (and therefore my version of it too of course) doesn't guarantee complete n-element permutations--it only guarantees that there are no successive repeats within any rolling window (which may be what @Dizzy-Dizzy wanted, which is another reason to start a new topic). I think that [array random] strategy only works if you are successively removing elements from the pool until it is empty.
Check out this test of your most recent version:
1776427700402-randompermutations2.pd

You can see that the permutations after the first two aren't complete. Maybe that wasn't your requirement?
. I usually don't care about efficiency and care more about code clarity, but your original proposed solution intrigued me because it was both arcane and minimal. Plus I'm not even sure how to implement something like motex/shuffle in normal imperative textual languages like c or Java (which is how I think, even when patching).