1

ループを使用して 0 から 51 までの配列をランダム化しようとしていますが、うまくいかないようです。私の考えはそれでした

  1. 乱数を生成する
  2. 以前の乱数を配列に格納して、この乱数が使用されたかどうかを確認します
  3. この乱数が使用されている場合は、重複がなくなるまで新しい乱数を生成します
  4. 重複していない場合は保管してください

私の試み:

    Dim list(51) As Integer
    Dim templist(51) As Integer

    For i As Integer = 0 To 51 Step 1
        list(i) = i
    Next i

    Do While counter <= 51
        p = rand.Next(0, 52)
        templist(counter) = p
        For n As Integer = 0 To 51 Step 1
            p = rand.Next(0, 52)
            If templist(n) = p Then
                Do While templist(n) = p
                    p = rand.Next(0, 52)
                Loop
                templist(n) = p
            Else
                templist(n) = p
            End If

        Next

        counter += 1
    Loop

    For n As Integer = 0 To 51 Step 1
        ListBox1.Items.Add(templist(n))
    Next
4

4 に答える 4

0

stackoverflow のフォーラムへの最初の応答 - 優しくしてください。これを行う方法を探していましたが、オンラインで適切な例を見つけることができませんでした。私は自分で試してみて、最終的にこれを機能させました:

Sub addUnique(ByRef tempList, ByVal n, ByRef s)
    Dim rand = CInt(Rnd() * 15) + 1
    For j = 0 To n
        If tempList(j) = rand Then
            s = True
        End If
    Next
    If s = False Then
        tempList(n) = rand
    Else
        s = False
        addUnique(tempList, n, s)
    End If
End Sub

次に、次を使用してサブを呼び出します。

Dim values(15) As Byte
Dim valueSeen As Boolean = False
For i = 0 To 15
    addUnique(values, i, valueSeen)
Next

これにより、1 から 16 までの数字がランダムに配列に追加されます。値が追加されるたびに、配列内の以前の値がチェックされ、それらのいずれかがランダムに生成された値と同じである場合、s が true に設定されます。値が見つからない場合 (s=false)、ランダムに生成された値が追加されます。'For' ループの最後で s がまだ true である場合、sub は再帰的に再度呼び出されます。おそらくどこかに「Randomize()」が必要です。

レイアウトが少しぐらついている場合はご容赦ください。

于 2016-11-23T14:13:22.760 に答える
0

約 5 年間 VB を書いていませんが、これを試してみてください。

Function GetRandomUniqueNumbersList(ByVal fromNumber As Integer, ByVal toNumber As Integer) As List(Of Integer)
    If (toNumber <= fromNumber) Then
        Throw New ArgumentException("toNumber must be greater than fromNumber", toNumber)
    End If
    Dim random As New Random
    Dim randomNumbers As New HashSet(Of Integer)()
    Do
        randomNumbers.Add(random.Next(fromNumber, toNumber))
    Loop While (randomNumbers.Count < toNumber - fromNumber)
    Return randomNumbers.ToList()
End Function

わかりました、それは痛かったです。間違いがあれば誰か訂正してください。HashSet を使用しているため、非常に高速なはずです。

于 2013-07-16T01:36:19.070 に答える