掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
.Netで英数字の乱数発生するには。。 (ID:82549)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
# ありゃ。回答を書いたのに、それを投稿するのをすっかり忘れてました……。 # 既に他の方から回答が付いていますが、折角書いたので、一応載せておきます。 ------------------------------------- こんな感じで如何でしょうか。 「チンプンカンプンの状態」との事なので、コメントを心持ち多めに書いてみました。(^^; '「8桁の文字列」を配列で返します。 'ArrayLength には生成する個数を指定してください。 Public Function CreateRandomData(ByVal ArrayLength As Integer) As String() '文字列の長さ - 1 Const DataLength As Integer = 8 - 1 '生成されるデータ文字列 Const DataKey As String _ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" _ & "abcdefghijklmnopqrstuvwxyz" _ & "1234567890" Dim MaxIndex As Integer = DataKey.Length - 1 '生成されるデータ。同一値を格納できないよう、Hashtableで管理します。 Dim RandomData As New System.Collections.Hashtable '乱数生成に使うシード値 Dim SeedValue As Integer = Environment.TickCount Do Until RandomData.Count >= ArrayLength Dim R As New System.Random(SeedValue) '乱数データを生成 Dim B(DataLength) As Char For N As Integer = 0 To DataLength B(N) = DataKey.Chars(R.Next(MaxIndex)) Next Dim KeyValue As String = B 'Hashtableに登録 RandomData(KeyValue) = True 'シード値を変更しておく(この処理を行うかどうかは任意です) If SeedValue = Integer.MaxValue Then SeedValue = Integer.MinValue Else SeedValue += 1 End If Loop 'Hashtableの内容を配列にして返します Dim DataList(ArrayLength - 1) As String RandomData.Keys().CopyTo(DataList, 0) Return DataList End Function Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load 'デバッグ用。生成されたデータを確認するために使います。 Me.ListBox1.Font = New Font("MS ゴシック", 9, FontStyle.Regular) Me.ListBox1.Sorted = True End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '100個のデータを作成し、ListBoxに表示します。 Me.ListBox1.Items.Clear() Me.ListBox1.Items.AddRange(CreateRandomData(100)) End Sub なお、Systen.Random や Microsoft.VisualBasic.VBMath.Rnd だと、 連続して作成された場合に、次の値を予測される可能性があるため、 パスワード等に利用するような乱数データの場合は、本来は System.Security.Cryptography.RNGCryptoServiceProvider クラスを 使った方が良いのですが、今回は「同じ値を返さない」という 縛りがあるので、System.Randomクラスで十分と判断しました。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.