shuffleは置換である。
昨日の答え。shuffleは置換である。ので、逆置換を求めればよい。ただそれだけである。例えば、中身が「茶・赤・橙・黄・緑」というコンテナをシャッフルした結果、「赤・緑・黄・橙・茶」となったとする。この置換と逆置換は、
このようになる。置換自体は、適当にインデックスと中身が一致した整数配列を用意してそれを同じ種の乱数でシャッフルすると求まる。また、逆置換に関しては、正置換(という言葉があるかどうかは妖しいが)の配列をインデックスと中身を逆にした配列を作ってソートすればよい。しかし、実際のところ、逆置換を作らずとも置換さえ求まれば元に施すのはさほど難しいことではない。正置換のインデックスがiのところの中身がjならば、元に戻したいコンテナのj番目の中身をi番目に入れてやればよい。これを繰り返せば元に戻る。
ただし、イテレータを引数とする関数として実装するのは激烈に難しいだろうけど。