Visual Basic サンプル集 |
Visual Basic 中学校 > Visual Basic サンプル集 > Visual Basic サンプル集目次 >
ランダムな文字列を生成する
2022/11/20
→ C# のサンプルに切り替える → 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文字を生成する
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
これでもできます。
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
A ~ Z からなる文字が重複しないランダムな5文字を生成する
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
半角英数 からなるランダムな5文字を生成する
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
これでもできます。
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
半角英数 からなる文字が重複しないランダムな5文字を生成する
'生成する文字の数 と 対象の全文字
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
ひらがな からなるランダムな5文字を生成する
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()) '出力例 ぬがゃぺょ
メモ:この例で生成されない ひらがな の例は「ゑ」、「ゔ」、「ぁ」(小さい あ)、「ゕ」(小さい か)など
メモ:Unicode で定義されている全ひらがなは Hiranaga で確認できます。
カタカナ からなるランダムな5文字を生成する
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()) '出力例 イャムギォ
メモ:この例で生成されない カタカナ の例は「ヱ」、「ヴ」、「ヵ」(小さい カ)、「ヶ」(小さい ケ)など
メモ:Unicode で定義されている全カタカナは Katakana で確認できます。
漢字 からなるランダムな5文字を生成する (Unicode版)
この例では、UnicodeのCJK等号漢字で定義されている範囲でランダムな5文字を生成します。この範囲には日本で使用されていない漢字も含まれます。
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()) '出力例 靘婞播鸆筨
メモ:この例で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
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()) '出力例 翹扎閑桿幇
指定した複数の文字 からなるランダムな 5文字を生成する
この例では、一例として「あいうえおカキクケコ東西南北🗼🗿🗾」の中からランダムな1文字を選択します。
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()) '出力例 う西🗾🗿う
文字種を限定せずランダムな 15文字を生成する(Unicode版)
この例ではUnicodeで定義されている文字からランダムに15文字を選んで文字列を生成します。
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())
メモ:文字がフォントに収録されているかチェックする部分を実行するには、WPFアプリの有効化が必要です。 その方法 → WPFの機能を有効にする
文字種を限定せずランダムな 15文字を生成する(Shift_JIS版)
この例では Shift_JIS で定義されている文字からランダムに15文字を選んで文字列を生成します。
#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())
ランダムなパスワードを生成する
この例では、半角英数および指定した記号からなる15文字のランダムなパスワードを生成します。パスワード内には最低限5文字の記号が含まれます。パスワードに含まれる記号は変数 symbols で定義しています。
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
メモ:このプログラムは .NET Framework の System.Web.Security.Membership.GeneratePassword のリファレンスソースを参考にしています。