Vb.net Visual Basic-随机数

Vb.net Visual Basic-随机数,vb.net,Vb.net,我有一些VB代码,它给我一个随机数,1在20(X)之间。然而,在20次尝试中,我将得到两次相同的数字。我怎样才能得到一个随机数序列而不重复它们?如果我点击按钮20次,我基本上希望1-20以随机顺序出现 Randomize() ' Gen random value value = CInt(Int((X.Count * Rnd()))) If value = OldValue Then Do While value = OldValue

我有一些VB代码,它给我一个随机数,1在20(X)之间。然而,在20次尝试中,我将得到两次相同的数字。我怎样才能得到一个随机数序列而不重复它们?如果我点击按钮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

为此,您需要存储所有以前生成的数字,而不仅仅是一个,正如您在名为OldValue的变量中所做的那样。所以,将之前生成的所有数字存储在某个位置(列表)。并将新生成的数字与列表中的所有数字进行比较,在ur while循环中,继续生成数字,而数字不等于列表中的任何一个。

对于1到20,请使用像LinkedList这样的数据结构,其中包含数字1到20。随机选择一个从1到20的索引,取该索引处的数字,然后在LinkedList的该位置弹出该数字。每个连续的迭代将选择一个索引,从1到19,pop,然后从1到18,pop,等等。直到剩下索引1到1,最后一项是最后一个随机数。很抱歉没有代码,但您应该得到它。

概念是,您必须
生成的随机数添加到
列表中,并且在将其添加到
列表中之前,确保
新编号
中没有
包含
。试试这个代码

        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测试
]

将数字添加到列表中,然后按随机顺序拾取,在拾取时将其删除

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
可能重复的