>>546 のやり方だと、処理が終わる保証がないという点がちょっと問題です。
(特に、選択元の要素数が極端に多い場合)
ヘタレな乱数ライブラリを使っているときは要注意です。
まあ、まずありえない事ですけど。
>>553 のやり方では、シャッフルにメモリは食いますが、処理が必ず終わる
(それもほぼ一定時間で)ことは保証できます。