normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

C#でランダム文字列の生成

私のhatena日記のリファラーを見る限り、「ランダム文字列の生成」が検索として利用される事が多いのでまとめることとする。
以前にも記述したが、ランダム文字列の生成方法には以下の手法がある。今回は以下の3手法についての検討を行う。

  1. System.IO.Path.GetRandomFileNameメソッドを使う
  2. System.Randomを使って、char 配列作成 → 文字列インスタンス生成
  3. 文字の母集団をchar配列で持ってシャッフル&一部取得

System.IO.Path.GetRandomFileNameメソッド

ためしに使ってみたけど、何か引数を指定する拡張ポイントもまったく無し。
以下の出力となる。

foreach (string str in 
   Enumerable.Range(0, 10).Select((n) => n + " : " + Path.GetRandomFileName()))
{
   Console.WriteLine(str);
}
//0 : 2mazw2r1.g3y
//1 : 3kv1xkbl.wkf
//2 : jk0ofkef.ni1
//3 : 34xye2os.lyg
//4 : zn4u5xjr.tjb
//5 : uxj4u2sd.htr
//6 : 3pimf333.koc
//7 : klpgg0kq.431
//8 : ew2iiugg.eel
//9 : qofeor5t.dfe

正規表現で書くと『^[0-9a-z]{8}\.[0-9a-z]{3}$』なとなる。数字と小文字アルファベットの組み合わせが文字列の要素となるようだ。文字列自体は正規表現で記述した形式でのみ生成されるため、用途に合わない場合は自分で文字列を整形する必要がある。

System.Randomを使って、char 配列作成 → 文字列インスタンス生成

まずは以下のコードを記述した。

Console.WriteLine(new string(Enumerable.Range(0, 5).Select(n =>
    list[rnd.Next(list.Count)]).ToArray()));
//?甄???

ランダムだけど、実用に耐えない文字列が出ます。rnd.Nextの引数制御で何とかなるかな?

仕方ないので、母集団を用意してランダムに取得していくコードを書いてみた。

List<char> list = new List<char>() { 'A','2','3','4','5','6','7','8','9','T','J','Q','K' };
Random rnd = new Random();
Console.WriteLine(new string(Enumerable.Range(0, 5).Select(n => 
   list[rnd.Next(list.Count)]).ToArray()));
//J7T45

こちらの方が実用的だと考えられる。