重複のない乱数リストをお手軽に生成する方法

作ったプログラムのテストとかでまとまった数の乱数が欲しいことがある。値が重複しても良いならひたすら乱数を生成する関数(rand()とか)を呼べばいい。
ところが場合によっては同じ値が何回も出現すると困ることがある。こういう時のために重複のない乱数リストをお手軽に生成したい。
これは以下のようにすればOK。


ここで紹介する方法ではshufコマンドを使うので、最初に以下の記事を参考にshufをインストしておくこと。

Coreutilsのshufを使ってみた - EchizenBlog-Zwei

インストしたら以下のようにすると重複のない乱数リストが得られる。

$$ perl -e 'while($i++ < 1000){print "$i\n"}' | shuf | head -3
190
179
908

この例では1000以下の重複なし乱数を3件生成した。具体的に何をしているのかを解説する。
まず

$$ perl -e 'while($i++ < 1000){print "$i\n"}' >> tmp
$$ cat tmp
1
2
3
4
5
...

というperlワンライナーで1000以下の数値を順番に出力している。生成する数値の範囲を広げる場合は、この1000を適当に書き換えれば良い。
次に

$$ shuf < tmp > tmp2
$$ cat tmp2
190
179
908
765
815
...

で順番に並んでいた数値をシャッフルしている。
最後に

$$ head -3 tmp2
190
179
908

で3件だけ出力している。これもheadの引数を変えれば生成する件数を変えられる。