8桁で英字(小文字含む)、数字で乱数を発生し且つ同じ値が発生しない方法を教えてください。例題があればうれしいのですが。。
同僚には論法だけを言ってくれるのですが、チンプンカンプンの状態です
申し訳ないですが、どなたかご伝授ください。
追伸です
ちなみに言語ですがVB.Netです
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
sBase っていらんな...重複は check して再度呼ぶ.
コード体系に非依存になるように
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
なんていうのも在りかも???
# ありゃ。回答を書いたのに、それを投稿するのをすっかり忘れてました……。
# 既に他の方から回答が付いていますが、折角書いたので、一応載せておきます。
-------------------------------------
こんな感じで如何でしょうか。
「チンプンカンプンの状態」との事なので、コメントを心持ち多めに書いてみました。(^^;
'「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クラスで十分と判断しました。
puntoさん、サムさん、魔界の仮面弁士さん 本当にありがとうございました。無事解決しました。本当にわかりやすくて助かります
また、簡単な質問をしたときによろしくお願いします
ツイート | ![]() |