2

20 (X) の間の 1 という乱数を与える VB コードがあります。ただし、20 回以内に同じ番号を 2 回取得します。乱数を繰り返さずに一連の乱数を取得するにはどうすればよいですか? ボタンを 20 回クリックすると、基本的に 1 ~ 20 がランダムな順序で表示されるようにします。

    Randomize()
    ' Gen random value

    value = CInt(Int((X.Count * Rnd())))

    If value = OldValue Then
        Do While value = OldValue
            value = CInt(Int((X.Count * Rnd())))    
        Loop
    End If
4

4 に答える 4

1

1 から 20 の場合は、1 から 20 の数字を保持する LinkedList のようなデータ構造を使用します。1 から 20 までのインデックスをランダムに選択し、そのインデックスの数字を取得してから、LinkedList のその場所にある数字をポップアウトします。連続する各反復では、インデックス 1 ~ 19、ポップ、次に 1 ~ 18、ポップなどのインデックスが選択され、インデックス 1 ~ 1 が残り、最後の項目が最後の乱数になります。コードがなくて申し訳ありませんが、取得する必要があります。

于 2013-03-28T04:14:10.520 に答える
1

概念は、 をaddgenerated random number追加する必要がlistあり、 に追加する前に、 が含まれていないlistことを確認することです。このコードを試して、new numbercontains

        Dim xGenerator As System.Random = New System.Random()
        Dim xTemp As Integer = 0
        Dim xRndNo As New List(Of Integer)

        While Not xRndNo.Count = 20

            xTemp = xGenerator.Next(1, 21)

            If xRndNo.Contains(xTemp) Then
                Continue While
            Else
                xRndNo.Add(xTemp)
            End If

        End While

[注:でテスト済みIDE]

于 2013-03-28T05:48:05.420 に答える
0

番号をリストに追加してからランダムな順序で選択し、選択すると削除します。

Dim prng As New Random
Dim randno As New List(Of Integer)

Private Sub Button1_Click(sender As Object, _
                          e As EventArgs) Handles Button1.Click
    If randno.Count = 0 Then
        Debug.WriteLine("new")
        randno = Enumerable.Range(1, 20).ToList 'add 1 to 20 to list
    End If
    Dim idx As Integer = prng.Next(0, randno.Count) 'pick a number
    Debug.WriteLine(randno(idx)) 'show it
    randno.RemoveAt(idx) 'remove it
End Sub
于 2013-03-28T15:12:12.327 に答える
0

そのためには、OldValue という名前の変数で行ったように、1 つだけではなく、以前に生成されたすべての数値を格納する必要があります。そのため、以前に生成されたすべての数値をどこかに保存します (リスト)。新しく生成された数値をリスト内のすべての数値と比較し、ur while ループ内で数値を生成し続けますが、数値はリスト内のいずれとも等しくありません。

于 2013-03-28T04:01:35.513 に答える