酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

テスト用にダミーの人名を自動生成させる方法

過去にテストで大量の人名が必要になりました。個人情報がとやかく言われるようになってきた時代で、本番DBから実データを利用するのはNGだったので、プログラム的に適当なそれっぽい名前を自動生成させて記憶があります。

第11回 テスト用の名前データを自動生成する:ITpro」を参考にVB.NETとC#で人名生成させる関数を作成しました。

C#の方は機械翻訳させたコードなので、コンパイルできなかったらごめんなさい。

VB.NET

    ''' <summary>  
    ''' 人名の生成を行う  
    ''' </summary>  
    ''' <param name="count">生成する人名数</param>  
    ''' <returns>  
    ''' 人名が格納されたString型配列  
    ''' </returns>  
    Function CreateName(ByVal count As Integer) As String()  
        Dim retNames(count) As String  
          
        Dim fName1 As String() = {"", "山", "川", "谷", "田", "小", "石", "水", "大", "橋", "野", "池", "吉", "中"}  
        Dim fName2 As String() = {"田", "本", "川", "口", "野", "村", "崎", "山", "島", "上", "浦", "内", "原"}  
          
        Dim lName1 As String() = {"順", "優", "恵", "浩", "裕", "正", "昭", "真", "純", "清", "博", "孝", "幸"}  
        Dim lName2 As String() = {"", "一", "二", "子", "美", "一郎", "実", "義", "夫", "雄", "太郎", "彦"}  
          
        ' 再現性を持たせる為、種を固定しています  
        Dim r As New System.Random(1000)  
        '' ランダムにする場合  
        'Dim r As New System.Random(Microsoft.VisualBasic.DateAndTime.Timer)  
      
        For i As Integer = 0 To retNames.Length - 1  
          
            Dim f1 As Integer = r.Next(0, fName1.Length - 1)  
            Dim f2 As Integer = r.Next(0, fName2.Length - 1)  
            Dim l1 As Integer = r.Next(0, lName1.Length - 1)  
            Dim l2 As Integer = r.Next(0, lName2.Length - 1)  
          
            Dim name As String = _  
            String.Format("{0}{1} {2}{3}", fName1(f1), fName2(f2), lName1(l1), lName2(l2))  
          
            retNames(i) = name  
        Next i  
          
        Return retNames  
    End Function  

C#

/// <summary>  
/// 人名の生成を行う  
/// </summary>  
/// <param name="count">生成する人名数</param>  
/// <returns>  
/// 人名が格納されたString型配列  
/// </returns>  
public string[] CreateName(int count)
{
	string[] retNames = new string[count + 1];

	string[] fName1 = {
		"",
		"山",
		"川",
		"谷",
		"田",
		"小",
		"石",
		"水",
		"大",
		"橋",
		"野",
		"池",
		"吉",
		"中"
	};
	string[] fName2 = {
		"田",
		"本",
		"川",
		"口",
		"野",
		"村",
		"崎",
		"山",
		"島",
		"上",
		"浦",
		"内",
		"原"
	};

	string[] lName1 = {
		"順",
		"優",
		"恵",
		"浩",
		"裕",
		"正",
		"昭",
		"真",
		"純",
		"清",
		"博",
		"孝",
		"幸"
	};
	string[] lName2 = {
		"",
		"一",
		"二",
		"子",
		"美",
		"一郎",
		"実",
		"義",
		"夫",
		"雄",
		"太郎",
		"彦"
	};

	// 再現性を持たせる為、種を固定しています  
	System.Random r = new System.Random(1000);
	//' ランダムにする場合  
	//Dim r As New System.Random(Microsoft.VisualBasic.DateAndTime.Timer)  

	for (int i = 0; i <= retNames.Length - 1; i++) {

		int f1 = r.Next(0, fName1.Length - 1);
		int f2 = r.Next(0, fName2.Length - 1);
		int l1 = r.Next(0, lName1.Length - 1);
		int l2 = r.Next(0, lName2.Length - 1);

		string name = string.Format("{0}{1} {2}{3}", fName1[f1], fName2[f2], lName1[l1], lName2[l2]);

		retNames[i] = name;
	}

	return retNames;
}

しかし、配列で持っている漢字の組み合わせが少なかったので、「何かもっと自然な方法な人名を生成する方法がありませんか?」という質問に対して、ぽぴ王子とまっちゃだいふくさんに「なんちゃって個人情報」と「a threadless kite - 糸の切れた凧(2007-01-20)」を教えてくれました。

今となっては、生の個人情報を扱う機会自体がなくなったので、自動でダミーデータを生成させる必要もなくなりました……