0

8 つの異なる文字を含む配列の作成に問題があり、それぞれが 3 つの異なる char 配列の 1 つから取得されます (1 つは厳密に小文字を含み、2 つ目は大文字のみを含み、3 つ目は数字のみを含みます)。

問題は、ランダムな char 配列から一度に 1 文字を取得することになっていることです。

各文字セットを含む配列は、次のように宣言されています。

Dim lcase() As Char = "abcdefghijklmnopqrstuvwxyz".ToCharArray()
Dim ucase() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray()
Dim num() As Char = "0123456789".ToCharArray()
Dim chars(7) As Char

最終的な配列を埋めるコードについては (私の場合は chars(7)):

Dim lim As Short = rand.Next(1, 5)
For x = 0 To lim
    Dim char_num As Integer = rand.Next(0, lcase.GetUpperBound(0))
    chars(x) = lcase(char_num)
Next
Dim lim2 As Short = 6 - lim
For x = 0 To lim2
    Dim char_num As Integer = rand.Next(0, num.GetUpperBound(0))
    chars(x) = num(char_num)
Next
For x = 0 To 6 - lim2
    Dim char_num As Integer = rand.Next(0, ucase.GetUpperBound(0))
    chars(x) = ucase(char_num)
Next

これは機能しますが、何らかの理由で(何らかの理由で)特定の値をnullのままにする傾向があり、最終的には次のような出力が得られます。

QHK M  D
 LCR86  

私が必要とするのは、コードが配列を適切に埋めることです。そのため、それぞれが 3 つの char 配列から取得された適切な値が含まれます。

注: myは、生成された後にそれに含まれる文字を交換して、それらの文字から完全にランダムな文字列を作成するため、chars(7)として宣言されています。Char

配列を埋めるコードのどこかで間違いを犯したのではないかと思いますが、私の間違いが上記のコードにない場合は、chars()配列内の文字の順序をランダム化するコードを次に示します。

Dim j As Integer
Dim swap As Char
Dim r As Random = New Random()

For i As Integer = 0 To chars.GetUpperBound(0)
    j = r.Next(0, i)
    swap = chars(j)
    chars(j) = chars(i)
    chars(i) = swap
Next i

よろしくお願いします。

更新: 間違いに気づきました。forループは配列に既に追加されているものを上書きし続けるため、最後のいくつかのスポットが開いたままになります。今必要なのは、最初の空のスロットにそれらを適切に追加する方法だけです.

4

3 に答える 3

0

なぜ 3 つの個別の配列があるのですか? 次のように、あなたの「アルファベット」を構成する1つの大きなものではないでしょうか:

Dim alphabet() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".ToCharArray()

「しかし、各文字セットから選択されていることをどのように知ることができますか?」という声が聞こえてきます。答えの一部は、配列からゼロ回選択する機会が存在しない限り、真にランダムではないということです。他の部分は、本当に必要な場合は、いつでも出力を検証して再ロールできることです。

これにより、はるかに単純なコードが得られます。

Dim alphabet() As Char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".ToCharArray()
For x As Integer to chars.Length - 1
   chars(x) = rand.Next(0, alphabet.Length)
Next
Return New String(chars)

それでおしまい。それがすべてです。これらの結果をシャッフルする必要もありません。

もう 1 つの優れた機能は、アルファベットを簡単に微調整できることです。たとえば、これらのコードをエンド ユーザーに伝える場合、混乱を避けるためにアルファベットから特定の文字を削除すると便利なことがよくあります。これを行うには、1 つの文字列を変更するだけで済みます。

Dim alphabet() As Char = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz123456789".ToCharArray()

これを注意深く見ると、大文字の「O」、小文字の「L」、数字の「0」の 3 文字が欠落していることに気付くでしょう。これらの文字を除外し、他の文字を適切に区別できるフォントを選択するようにすることで (Courier New は機能しますが、ほとんどの可変幅フォントではより多くの文字を削除する必要があります)、ヘルプ デスクへのかなりの数の電話を避けることができます。

于 2013-09-15T04:56:04.253 に答える