.Netで英数字の乱数発生するには。。

解決


初心者おじさん  2004-03-11 02:51:45  No: 82544

8桁で英字(小文字含む)、数字で乱数を発生し且つ同じ値が発生しない方法を教えてください。例題があればうれしいのですが。。
同僚には論法だけを言ってくれるのですが、チンプンカンプンの状態です
申し訳ないですが、どなたかご伝授ください。


初心者おじさん  2004-03-11 02:53:37  No: 82545

追伸です
ちなみに言語ですがVB.Netです


punto  2004-03-11 09:00:02  No: 82546

Private Function RandomString8() As String
        Dim s8Chars As String
        Dim sBase As String
        Dim sChar As String
        Dim iVal As Integer
        Dim lCount As Long

        Randomize()
        s8Chars = ""
        For lCount = 0 To 7
            iVal = Int(Rnd() * 62)
            Select Case iVal
                Case 0 To 25
                    sChar = Chr(Asc("A") + iVal)
                Case 26 To 51
                    sChar = Chr(Asc("a") + iVal - 26)
                Case 52 To 61
                    sChar = Chr(Asc("0") + iVal - 52)
                Case Else
                    sChar = "A"
            End Select
            s8Chars = s8Chars & sChar
        Next lCount
        RandomString8 = s8Chars
    End Function


punto  2004-03-11 09:02:38  No: 82547

sBase っていらんな...重複は check して再度呼ぶ.


サム  2004-03-11 20:55:23  No: 82548

コード体系に非依存になるように

public FUNCTION CODE()AS STRING
DIM PNT As string
DIM i AS INTEGER
PTN="abc....ABC...012...9"  '62CHR
CODE=""
for i=1 to 25
CODE=CODE & MID(PNT,INT(RND()*62,1)
next
end function

なんていうのも在りかも???


魔界の仮面弁士  2004-03-11 22:46:36  No: 82549

# ありゃ。回答を書いたのに、それを投稿するのをすっかり忘れてました……。
# 既に他の方から回答が付いていますが、折角書いたので、一応載せておきます。

-------------------------------------
こんな感じで如何でしょうか。

「チンプンカンプンの状態」との事なので、コメントを心持ち多めに書いてみました。(^^;

'「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クラスで十分と判断しました。


初心者おじさん  2004-03-15 20:26:49  No: 82550

puntoさん、サムさん、魔界の仮面弁士さん  本当にありがとうございました。無事解決しました。本当にわかりやすくて助かります
また、簡単な質問をしたときによろしくお願いします


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加