| C# サンプル集 | 
Visual Basic 中学校 > C# サンプル集 > C# サンプル集目次 >
ランダムな文字列を生成する
2022/11/20
→ Visual Basic のサンプルに切り替える → Python のサンプルに切り替える
目次
- A ~ Z からなるランダムな5文字を生成する
- A ~ Z からなる文字が重複しないランダムな5文字を生成する
- 半角英数 からなるランダムな5文字を生成する
- 半角英数 からなる文字が重複しないランダムな5文字を生成する
- ひらがな からなるランダムな5文字を生成する
- カタカナ からなるランダムな5文字を生成する
- 漢字 からなるランダムな5文字を生成する (Unicode版)
- 漢字 からなるランダムな5文字を生成する (Shift_JIS版)
- 指定した複数の文字 からなるランダムな 5文字を生成する
- 文字種を限定せずランダムな 15文字を生成する(Unicode版)
- 文字種を限定せずランダムな 15文字を生成する(Shift_JIS版)
- ランダムなパスワードを生成する
A ~ Z からなるランダムな5文字を生成する
var builder = new System.Text.StringBuilder();
Random r = new Random();
for (int i = 0; i < 5; i++)
{
    builder.Append(char.ConvertFromUtf32(r.Next('A', 'Z' + 1)));
}
System.Diagnostics.Debug.WriteLine(builder.ToString()); //出力例 AXJAD
これでもできます。
Random r = new Random();
string result = string.Concat(Enumerable.Range(0, 5).Select(i => char.ConvertFromUtf32(r.Next('A', 'Z' + 1))));
System.Diagnostics.Debug.WriteLine(result); //出力例 AXJAD
A ~ Z からなる文字が重複しないランダムな5文字を生成する
int count = 5; //生成する文字の数
// 'A' から 'Z' の文字コードのリストを作成
var CharRange = (int start, int end) => Enumerable.Range(start, end - start + 1);
int[] codes = CharRange('A', 'Z').ToArray();
//文字コードリストの最初の5個を、ランダムに選択した別の位置と入れ替える。
Random r = new Random();
for (int i = 0; i < count; i++)
{
    int randomIndex = r.Next(codes.Length);
    (codes[i], codes[randomIndex]) = (codes[randomIndex], codes[i]);
}
//文字コードリストの最初の5個を文字にして結合する。
string result = string.Concat(codes[..count].Select(i => char.ConvertFromUtf32(i)));
System.Diagnostics.Debug.WriteLine(result); //出力例 KGRUT
半角英数 からなるランダムな5文字を生成する
var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".EnumerateRunes().ToArray();
var builder = new System.Text.StringBuilder();
Random r = new Random();
for (int i = 0; i < 5; i++)
{
    builder.Append(chars[r.Next(chars.Length)]);
}
System.Diagnostics.Debug.WriteLine(builder.ToString()); //出力例 sS33J
これでもできます。
var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".EnumerateRunes().ToArray();
Random r = new Random();
string result = string.Concat(Enumerable.Range(0, 5).Select(i => chars[r.Next(chars.Length)]));
System.Diagnostics.Debug.WriteLine(result); //出力例 sS33J
半角英数 からなる文字が重複しないランダムな5文字を生成する
//生成する文字の数 と 対象の全文字
int count = 5;
var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".EnumerateRunes().ToArray();
//対象の全文字と同じ数だけ 0,1,2,.... という数字の配列を生成する。
int[] indexes = Enumerable.Range(0, chars.Count()).ToArray();
//数字の配列の最初の5個を、ランダムに選択した別の位置と入れ替える。
//例 0,1,2,3,4,5,6,7,... という配列が 実行後 43,3,21,26,30,5,6,7,... となります。 
Random r = new Random();
for (int i = 0; i < count; i++)
{
    int randomIndex = r.Next(indexes.Length);
    (indexes[i], indexes[randomIndex]) = (indexes[randomIndex], indexes[i]);
}
//数字の配列の最初の5個の位置にあるsourceの文字を結合する。
//例 43,3,21,26,30 の位置にある R,2, v, A, E を使って R2vAE という文字列になります。
string result = string.Concat(indexes[..count].Select(i => chars[i]));
System.Diagnostics.Debug.WriteLine(result); //出力例 R2vAE
ひらがな からなるランダムな5文字を生成する
var chars = ("あいうえおかきくけこさしすせそたちつてとなにぬねの" +
             "はひふへほまみむめもやゆよらりるれろわをん" +
             "がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽ" +
             "っゃゅょ").EnumerateRunes().ToArray();
var builder = new System.Text.StringBuilder();
Random r = new Random();
for (int i = 0; i < 5; i++)
{
    builder.Append(chars[r.Next(chars.Length)]);
}
System.Diagnostics.Debug.WriteLine(builder.ToString()); //出力例 ぬがゃぺょ
					
					メモ:この例で生成されない ひらがな の例は「ゑ」、「ゔ」、「ぁ」(小さい あ)、「ゕ」(小さい か)など
メモ:Unicode で定義されている全ひらがなは Hiranaga で確認できます。
カタカナ からなるランダムな5文字を生成する
var chars = ("アイウエオカキクケコサシスセソタチツテトナニヌネノ" +
             "ハヒフヘホマミムメモヤユヨラリルレロワヲン" +
             "ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ" +
             "ァィゥェォッャュョ").EnumerateRunes().ToArray();
var builder = new System.Text.StringBuilder();
Random r = new Random();
for (int i = 0; i < 5; i++)
{
    builder.Append(chars[r.Next(chars.Length)]);
}
System.Diagnostics.Debug.WriteLine(builder.ToString()); //出力例 イャムギォ
					
					メモ:この例で生成されない カタカナ の例は「ヱ」、「ヴ」、「ヵ」(小さい カ)、「ヶ」(小さい ケ)など
メモ:Unicode で定義されている全カタカナは Katakana で確認できます。
漢字 からなるランダムな5文字を生成する (Unicode版)
この例では、UnicodeのCJK統合漢字で定義されている範囲でランダムな5文字を生成します。この範囲には日本で使用されていない漢字も含まれます。
var builder = new System.Text.StringBuilder();
Random r = new Random();
for (int i = 0; i < 5; i++)
{
    builder.Append(char.ConvertFromUtf32(r.Next(0x4E00, 0x9FD5 + 1)));
}
System.Diagnostics.Debug.WriteLine(builder.ToString()); //出力例 靘婞播鸆筨
					
					メモ:この例でUnicode の 4E00 から 9FD5 の範囲にある約2万文字の漢字からランダムな5文字を生成します。この範囲の漢字の一覧は CJK Unified Ideographs(CJK統合漢字) で確認できます。この約2万文字はUnicodeで最も主要な漢字の集合です。この中には日本では使用されない漢字も含まれます。(Unicodeでは日本で使用されている漢字だけの集合は定義されていません。)
漢字 からなるランダムな5文字を生成する (Shift_JIS版)
この例では、Shift_JIS で定義されている漢字の範囲でランダムな5文字を生成します。
#if NETCOREAPP
    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
#endif
var builder = new System.Text.StringBuilder();
Random r = new Random();
var sjis = System.Text.Encoding.GetEncoding("shift_jis");
for (int i = 0; i < 5; i++)
{
    char c;
    do
    {
        //漢字の範囲を 0x889F~0x9FFF と 0xE040~0xEAA4 に2分して考える。
        //この範囲内でランダムな値を生成する。
        int code = r.Next(0x889F, 0x9FFF + (0xEAA4 - 0xE040) + 1);
        if (code > 0x9FFF)
        {
            code = code - 0x9FFF + 0xE040;
        }
        c = sjis.GetString(BitConverter.GetBytes(code).Reverse().ToArray()).Last();
    } while (c == '・');
    builder.Append(c);
}
System.Diagnostics.Debug.WriteLine(builder.ToString()); //出力例 翹扎閑桿幇
					
指定した複数の文字 からなるランダムな 5文字を生成する
この例では、一例として「あいうえおカキクケコ東西南北🗼🗿🗾」の中からランダムな1文字を選択します。
var chars = ("あいうえお" + 
             "カキクケコ" +
             "東西南北" + 
             "🗼🗿🗾").EnumerateRunes().ToArray();
var builder = new System.Text.StringBuilder();
Random r = new Random();
for (int i = 0; i < 5; i++)
{
    builder.Append(chars[r.Next(chars.Length)]);
}
System.Diagnostics.Debug.WriteLine(builder.ToString()); //出力例 う西🗾🗿う
文字種を限定せずランダムな 15文字を生成する(Unicode版)
この例ではUnicodeで定義されている文字からランダムに15文字を選んで文字列を生成します。
var builder = new System.Text.StringBuilder();
Random r = new Random();
//文字がフォントに収録されているかチェックする場合は有効にします。実行するにはWPFの有効化が必要な場合があります。メモ欄参照。
//var gtf = new System.Windows.Media.GlyphTypeface(new Uri(@"C:\Windows\Fonts\meiryo.ttc"));
for (int i = 0; i < 15; i++)
{
    while(true)
    {
        int codePoint = r.Next(0x00020, 0x3134F + 1); //Unicodeのほとんどの文字を対象にします。
        //int codePoint = r.Next(0x00020, 0x0FFFD + 1); //Unicodeの基本多言語面(通常使う文字群)を対象にします。
        if (codePoint >= 0xD800 && codePoint <= 0xDFFF)
        {
            //サロゲート領域は生成しないようにします。
            continue;
        }
        else if (codePoint >= 0xE000 && codePoint <= 0xF8FF)
        {
            //私用領域は生成しないようにします。
            continue;
        }
        //フォントの収録チェックをする場合に有効にします。実行するにはWPFの有効化が必要な場合があります。メモ欄参照。
        //if (!gtf.CharacterToGlyphMap.ContainsKey(codePoint))
        //{
        //    //フォント「メイリオ」に収録されていない文字は生成しないようにします。
        //    continue;
        //}
        builder.Append(char.ConvertFromUtf32(codePoint));
        break;
    }
    
}
//出力例 壙パ♣痰課飠勵愱ʼn鬯累心⏅譅綈
System.Diagnostics.Debug.WriteLine(builder.ToString());
					
					メモ:文字がフォントに収録されているかチェックする部分を実行するには、WPFアプリの有効化が必要です。 その方法 → WPFの機能を有効にする
文字種を限定せずランダムな 15文字を生成する(Shift_JIS版)
この例では Shift_JIS で定義されている文字からランダムに15文字を選んで文字列を生成します。
#if NETCOREAPP
    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
#endif
var builder = new System.Text.StringBuilder();
Random r = new Random();
var sjis = System.Text.Encoding.GetEncoding("shift_jis");
for (int i = 0; i < 15; i++)
{
    while (true)
    {
        int code = r.Next(0x0020, 0xFFFF);
        byte[] b = BitConverter.GetBytes(code).Reverse().ToArray();
        byte b1 = b[2]; //1バイト目
        byte b2 = b[3]; //2バイト目
        if ((b1 == 0x00)
            && ((b2 >= 0x20 && b2 <= 0x7E) || (b2 >= 0xA1 && b2 <= 0xDF)))
        {
            //1バイト文字の場合、この範囲は文字が定義されているのでOK
        }
        else if (
                  ((b1 >= 0x81 && b1 <= 0x9F) || (b1 >= 0xE0 && b1 <= 0xEF))
                  &&
                  ((b2 >= 0x49 && b2 <= 0x7E) || (b2 >= 0x80 && b2 <= 0xFC))
                )
        {
            //2バイト文字の場合、この範囲は文字が定義されているのでOK
        }
        else
        {
            //その他の場合文字が定義されていないので生成しない。
            continue;
        }
        char c = sjis.GetString(b).Last();
        if (code != 0x8145 && c == '・')
        {
            //変換できない文字は生成しません。81B5 などが該当。
            continue;
        }
        builder.Append(c);
        break;
    }
}
//出力例 蹂宙董鐘碕瑩u等涖㈹ム胥激鮻る
System.Diagnostics.Debug.WriteLine(builder.ToString());
					
ランダムなパスワードを生成する
この例では、半角英数および指定した記号からなる15文字のランダムなパスワードを生成します。パスワード内には最低限5文字の記号が含まれます。パスワードに含まれる記号は変数 symbols で定義しています。
int passwordLength = 15; //生成するパスワードの文字数
int numberOfNonAlphanumericCharacters = 5; //パスワードに最低限含まれる記号の文字数
//パスワードに含まれる可能性がある記号の一覧
var symbols = "!@#$%^&*()_-+=[{]};:>|./?".ToArray();
byte[] buffer = RandomNumberGenerator.GetBytes(passwordLength);
char[] password = buffer.Select(b => b % 87).Select(x => 
{
    return x switch
    {
        < 10 => (char)('0' + x),
        < 36 => (char)('A' + x - 10),
        < 62 => (char)('a' + x - 36),
        _ => symbols[x-62]
    };
}).ToArray();
//生成された記号の数が少ない場合補う。
int symbolCount = 0;
foreach(char item in password)
{
    symbolCount += symbols.Contains(item) ? 1 : 0;
}
int additionalSymbolCount = numberOfNonAlphanumericCharacters - symbolCount;
if (additionalSymbolCount > 0)
{
    Random r = new Random();
    for (int i = 0; i < additionalSymbolCount; i++)
    {
        int index;
        do
        {
            index = r.Next(passwordLength);
        } while (!char.IsLetterOrDigit(password[index]));
        password[index] = symbols[r.Next(symbols.Length)];
    }
}
string strPassword = new string(password);
System.Diagnostics.Debug.WriteLine(strPassword); //出力例 S}!SB}=3gn&Gn9q
					メモ:このプログラムは .NET Framework の System.Web.Security.Membership.GeneratePassword のリファレンスソースを参考にしています。