ヘッダー
Visual Basic サンプル集
 

ランダムな文字列を生成する

2022/11/20

→ C# のサンプルに切り替える → Python のサンプルに切り替える

 

A ~ Z からなるランダムな5文字を生成する

VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim builder As New System.Text.StringBuilder()
Dim r As New Random()

For i = 0 To 5 - 1
    builder.Append(Char.ConvertFromUtf32(r.Next(Asc("A"), Asc("Z") + 1)))
Next

Debug.WriteLine(builder.ToString()) '出力例 AXJAD

Debug.WriteLineが表示される場所

 

これでもできます。

VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim r As New Random()
Dim result As String = String.Concat(Enumerable.Range(0, 5).Select(Function(i) Char.ConvertFromUtf32(r.Next(Asc("A"), Asc("Z") + 1))))

Debug.WriteLine(result) '出力例 AXJAD

Debug.WriteLineが表示される場所

 

A ~ Z からなる文字が重複しないランダムな5文字を生成する

VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim count As Integer = 5 '生成する文字の数

' "A" から "Z" の文字コードのリストを作成
Dim CharRange = Function(iStart As Integer, iEnd As Integer) Enumerable.Range(iStart, iEnd - iStart + 1)
Dim codes() As Integer = CharRange(Asc("A"), Asc("Z")).ToArray()

'文字コードリストの最初の5個を、ランダムに選択した別の位置と入れ替える。
Dim r As New Random()
For i = 0 To count - 1
    Dim randomIndex As Integer = r.Next(codes.Length)
    Dim temp As Integer = codes(i)
    codes(i) = codes(randomIndex)
    codes(randomIndex) = temp
Next

'文字コードリストの最初の5個を文字にして結合する。
Dim result As String = String.Concat(codes.Take(count).Select(Function(i) Char.ConvertFromUtf32(i)))

Debug.WriteLine(result) '出力例 KGRUT

Debug.WriteLineが表示される場所

 

 

半角英数 からなるランダムな5文字を生成する

VB2019対応 Visual Studio 2022

Dim chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".EnumerateRunes().ToArray()

Dim builder As New System.Text.StringBuilder()
Dim r As New Random()
For i As Integer = 0 To 5 - 1
    builder.Append(chars(r.Next(chars.Length)))
Next

Debug.WriteLine(builder.ToString()) '出力例 sS33J

Debug.WriteLineが表示される場所

 

これでもできます。

VB2019対応 Visual Studio 2022

Dim chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".EnumerateRunes().ToArray()
Dim r As New Random()
Dim result As String = String.Concat(Enumerable.Range(0, 5).Select(Function(i) chars(r.Next(chars.Length))))

Debug.WriteLine(result) '出力例 sS33J

Debug.WriteLineが表示される場所

 

 

半角英数 からなる文字が重複しないランダムな5文字を生成する

VB2019対応 Visual Studio 2022

'生成する文字の数 と 対象の全文字
Dim count As Integer = 5
Dim chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".EnumerateRunes().ToArray()

'対象の全文字と同じ数だけ 0,1,2,.... という数字の配列を生成する。
Dim indexes() As Integer = Enumerable.Range(0, chars.Count()).ToArray()

'数字の配列の最初の5個を、ランダムに選択した別の位置と入れ替える。
'例 0,1,2,3,4,5,6,7,... という配列が 実行後 43,3,21,26,30,5,6,7,... となります。 
Dim r As New Random()
For i As Integer = 0 To count - 1
    Dim randomIndex As Integer = r.Next(indexes.Length)
    Dim temp As Integer = indexes(i)
    indexes(i) = indexes(randomIndex)
    indexes(randomIndex) = temp
Next

'数字の配列の最初の5個の位置にあるsourceの文字を結合する。
'例 43,3,21,26,30 の位置にある R,2, v, A, E を使って R2vAE という文字列になります。
Dim result As String = String.Concat(indexes.Take(count).Select(Function(i) chars(i)))

Debug.WriteLine(result) '出力例 R2vAE

Debug.WriteLineが表示される場所

 

 

ひらがな からなるランダムな5文字を生成する

VB2019対応 Visual Studio 2022

Dim chars = ("あいうえおかきくけこさしすせそたちつてとなにぬねの" +
             "はひふへほまみむめもやゆよらりるれろわをん" +
             "がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽ" +
             "っゃゅょ").EnumerateRunes().ToArray()

Dim builder As New System.Text.StringBuilder()
Dim r As New Random()
For i As Integer = 0 To 5 - 1
    builder.Append(chars(r.Next(chars.Length)))
Next

Debug.WriteLine(builder.ToString()) '出力例 ぬがゃぺょ

Debug.WriteLineが表示される場所

メモ:この例で生成されない ひらがな の例は「ゑ」、「ゔ」、「ぁ」(小さい あ)、「ゕ」(小さい か)など

メモ:Unicode で定義されている全ひらがなは Hiranaga で確認できます。

 

 

カタカナ からなるランダムな5文字を生成する

VB2019対応 Visual Studio 2022

Dim chars = ("アイウエオカキクケコサシスセソタチツテトナニヌネノ" +
             "ハヒフヘホマミムメモヤユヨラリルレロワヲン" +
             "ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ" +
             "ァィゥェォッャュョ").EnumerateRunes().ToArray()

Dim builder As New System.Text.StringBuilder()
Dim r As New Random()
For i As Integer = 0 To 5 - 1
    builder.Append(chars(r.Next(chars.Length)))
Next

Debug.WriteLine(builder.ToString()) '出力例 イャムギォ

Debug.WriteLineが表示される場所

メモ:この例で生成されない カタカナ の例は「ヱ」、「ヴ」、「ヵ」(小さい カ)、「ヶ」(小さい ケ)など

メモ:Unicode で定義されている全カタカナは Katakana  で確認できます。

 

 

漢字 からなるランダムな5文字を生成する (Unicode版)

この例では、UnicodeのCJK等号漢字で定義されている範囲でランダムな5文字を生成します。この範囲には日本で使用されていない漢字も含まれます。

VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim builder As New System.Text.StringBuilder()
Dim r As New Random()

For i = 0 To 5 - 1
    builder.Append(Char.ConvertFromUtf32(r.Next(&H4E00, &H9FD5 + 1)))
Next

Debug.WriteLine(builder.ToString()) '出力例 靘婞播鸆筨

Debug.WriteLineが表示される場所

メモ:この例でUnicode の 4E00 から 9FD5 の範囲にある約2万文字の漢字からランダムな5文字を生成します。この範囲の漢字の一覧は CJK Unified Ideographs(CJK統合漢字) で確認できます。この約2万文字はUnicodeで最も主要な漢字の集合です。この中には日本では使用されない漢字も含まれます。(Unicodeでは日本で使用されている漢字だけの集合は定義されていません。)

 

 

漢字 からなるランダムな5文字を生成する (Shift_JIS版)

この例では、Shift_JIS で定義されている漢字の範囲でランダムな5文字を生成します。

VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

#if NETCOREAPP
    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance)
#endif
Dim builder As New System.Text.StringBuilder()
Dim r As New Random()
Dim sjis = System.Text.Encoding.GetEncoding("shift_jis")

For i As Integer = 0 To 5 - 1
    Dim c As Char
    Do
        '漢字の範囲を &H889F~&H9FFF と &HE040~&HEAA4 に2分して考える。
        'この範囲内でランダムな値を生成する。
        Dim code As Integer = r.Next(&H889F, &H9FFF + (&HEAA4 - &HE040) + 1)
        If code > &H9FFF Then
            code = code - &H9FFF + &HE040
        End If

        c = sjis.GetString(BitConverter.GetBytes(code).Reverse().ToArray()).Last()
    Loop While c = "・"c

    builder.Append(c)
Next

Debug.WriteLine(builder.ToString()) '出力例 翹扎閑桿幇

Debug.WriteLineが表示される場所

 

 

指定した複数の文字 からなるランダムな 5文字を生成する

この例では、一例として「あいうえおカキクケコ東西南北🗼🗿🗾」の中からランダムな1文字を選択します。

VB2019対応 Visual Studio 2022

Dim chars = ("あいうえお" + 
             "カキクケコ" +
             "東西南北" + 
             "🗼🗿🗾").EnumerateRunes().ToArray()

Dim builder As New System.Text.StringBuilder()
Dim r As New Random()
For i As Integer = 0 To 5 - 1
    builder.Append(chars(r.Next(chars.Length)))
Next

Debug.WriteLine(builder.ToString()) '出力例 う西🗾🗿う

Debug.WriteLineが表示される場所

 

 

文字種を限定せずランダムな 15文字を生成する(Unicode版)

この例ではUnicodeで定義されている文字からランダムに15文字を選んで文字列を生成します。

VB.NET2003対応 VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

Dim builder = New System.Text.StringBuilder()
Dim r As New Random()

'文字がフォントに収録されているかチェックする場合は有効にします。実行するにはWPFの有効化が必要な場合があります。メモ欄参照。
'Dim gtf As New System.Windows.Media.GlyphTypeface(New Uri("C:\Windows\Fonts\meiryo.ttc"))

For i As Integer = 0 To 15 - 1
    While True
        Dim codePoint As Integer = r.Next(&H00020, &H3134F + 1) 'Unicodeのほとんどの文字を対象にします。
        'Dim codePoint As Integer = r.Next(&H00020, &H0FFFD + 1) 'Unicodeの基本多言語面(通常使う文字群)を対象にします。

        If codePoint >= &HD800 AndAlso codePoint <= &HDFFF Then
            'サロゲート領域は生成しないようにします。
            Continue While
        Else If codePoint >= &HE000 AndAlso codePoint <= &HF8FF Then
            '私用領域は生成しないようにします。
            Continue While
        End If

        'フォントの収録チェックをする場合に有効にします。実行するにはWPFの有効化が必要な場合があります。メモ欄参照。
        'If Not gtf.CharacterToGlyphMap.ContainsKey(codePoint) Then
        '    'フォント「メイリオ」に収録されていない文字は生成しないようにします。
        '    Continue While
        'End If

        builder.Append(Char.ConvertFromUtf32(codePoint))
        Exit While
    End While
Next

'出力例 壙パ♣痰課飠勵愱ʼn鬯累心⏅譅綈
Debug.WriteLine(builder.ToString())

Debug.WriteLineが表示される場所

メモ:文字がフォントに収録されているかチェックする部分を実行するには、WPFアプリの有効化が必要です。 その方法 → WPFの機能を有効にする

 

 

文字種を限定せずランダムな 15文字を生成する(Shift_JIS版)

この例では Shift_JIS で定義されている文字からランダムに15文字を選んで文字列を生成します。

VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 Visual Studio 2022

#If NETCOREAPP Then
    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance)
#End If

Dim builder As New System.Text.StringBuilder()
Dim r As New Random()

Dim sjis = System.Text.Encoding.GetEncoding("shift_jis")

For i As Integer = 0 To 15 - 1
    While True
        Dim code As Integer = r.Next(&H0020, &HFFFF)
        Dim b() As Byte = BitConverter.GetBytes(code).Reverse().ToArray()
        Dim b1 As Byte = b(2) '1バイト目
        Dim b2 As Byte = b(3) '2バイト目

        If (b1 = &H00) _
           AndAlso ((b2 >= &H20 AndAlso b2 <= &H7E) OrElse (b2 >= &HA1 AndAlso b2 <= &HDF)) Then
            '1バイト文字の場合、この範囲は文字が定義されているのでOK
        ElseIf ((b1 >= &H81 AndAlso b1 <= &H9F) OrElse (b1 >= &HE0 AndAlso b1 <= &HEF)) _
                AndAlso
                ((b2 >= &H49 AndAlso b2 <= &H7E) OrElse (b2 >= &H80 AndAlso b2 <= &HFC)) Then
            '2バイト文字の場合、この範囲は文字が定義されているのでOK
        Else
            'その他の場合文字が定義されていないので生成しない。
            Continue While
        End If

        Dim c As Char = sjis.GetString(b).Last()

        If code <> &H8145 AndAlso c = "・"c Then
            '変換できない文字は生成しません。81B5 などが該当。
            Continue While
        End If

        builder.Append(c)
        Exit While
    End While
Next

'出力例 蹂宙董鐘碕瑩u等涖㈹ム胥激鮻る
Debug.WriteLine(builder.ToString())

Debug.WriteLineが表示される場所

 

 

ランダムなパスワードを生成する

この例では、半角英数および指定した記号からなる15文字のランダムなパスワードを生成します。パスワード内には最低限5文字の記号が含まれます。パスワードに含まれる記号は変数 symbols で定義しています。

Visual Studio 2022

Dim passwordLength As Integer = 15 '生成するパスワードの文字数
Dim numberOfNonAlphanumericCharacters As Integer = 5 'パスワードに最低限含まれる記号の文字数

'パスワードに含まれる可能性がある記号の一覧
Dim symbols = "!@#$%^&*()_-+=[{]};:>|./?".ToArray()

Dim buffer() As Byte = RandomNumberGenerator.GetBytes(passwordLength)
Dim password() As Char = buffer.Select(Function(b) b mod 87).
    Select(Function(x) 
               Select Case x
                   Case Is < 10
                       Return Chr(Asc("0") + x)
                   Case Is < 36
                       Return Chr(Asc("A") + x - 10)
                   Case Is < 62
                       Return Chr(Asc("a") + x - 36)
                   Case Else
                       Return symbols(x-62)
               End Select
           End Function).ToArray()


'生成された記号の数が少ない場合補う。
Dim symbolCount As Integer = 0
For Each item As Char in password
    symbolCount += If(symbols.Contains(item), 1, 0)
Next

Dim additionalSymbolCount As Integer = numberOfNonAlphanumericCharacters - symbolCount

If additionalSymbolCount > 0 Then
    Dim r As New Random()
    For i As Integer = 0 To additionalSymbolCount - 1
        Dim index As Integer
        Do
            index = r.Next(passwordLength)
        Loop Until char.IsLetterOrDigit(password(index))
        password(index) = symbols(r.Next(symbols.Length))
    Next
End If

Dim strPassword As New String(password)
Debug.WriteLine(strPassword) '出力例 S}!SB}=3gn&Gn9q

Debug.WriteLineが表示される場所

メモ:このプログラムは .NET Framework の System.Web.Security.Membership.GeneratePassword のリファレンスソースを参考にしています。