投稿は初めてですがよろしくお願いします。
現在、WinXP ProとVB2005で開発しています。
バイト型の配列を乱数で作っ後に変換して
英大文字・小文字・数字のパスワードを
作ろうとしています。
For i As Integer = 0 To iLength - 1
Dim IntB As Integer = New System.Random().Next(15)
Select Case IntB
Case 0, 3, 6, 9, 12
bBytes(i) = CType(hRandom.Next(1, 26) + 64, Byte) '大文字
Form1.Label1.Text += "," & IntB
Case 1, 4, 7, 10, 13
bBytes(i) = CType(hRandom.Next(1, 26) + 96, Byte) '小文字
Form1.Label1.Text += "," & IntB
Case 2, 5, 8, 11, 14
bBytes(i) = CType(hRandom.Next(1, 10) + 47, Byte) '数字
Form1.Label1.Text += "," & IntB
End Select
Next i
上記のようなコードを書いたのですが、実行するとIntBの値が
全部,10,10,10,10,10になったり
,8,8,8,8,8,8,11,11,11,11,11,11,11,14,14
のように一つのCaseの数が連続して表示されます。
デバッグで動きを確かめようと思ったのですが、デバッグでは正常にループが作用して同じ数字が何でも連続で出現するする事がなく、原因が解明できませんでした。
何が悪いのか、アドバイスお願いします。
ちょっと抜けてました
Dim hRandom As New System.Random()
Dim bBytes(iLength - 1) As Byte
iLengthは表示させたい桁数です。
シード値省略なら現在時刻からシードをとるので、
頻繁に初期化してれば(時刻が変わらなければ)毎回同じ値を返すでしょう。
>Dim IntB As Integer = New System.Random().Next(15)
をループの外に出して、ループ内で.Nextでどうでしょう。
ループの外でNewしてから、ループの中で.Next
で期待の動きが出来ました。
シード値という言葉を初めて聞いたので
これから調べたいと思います。
もげさん、ありがとうございました。
| ツイート |
|