我有一些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
答案 0 :(得分:1)
对于1到20,使用像LinkedList这样的数据结构,其中包含数字1到20.随机选择1到20的索引,取该索引处的数字,然后弹出LinkedList的那个位置的数字。每次连续迭代将选择1到19,pop,然后1到18,pop等索引,直到你留下索引1到1,最后一项是最后一个随机数。很抱歉没有代码,但你应该得到它。
答案 1 :(得分:1)
概念是,您必须add
将generated random number
加入list
,然后在将其添加到list
之前,请确保new number
其中不是contains
。试试这段代码,
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
进行测试]
答案 2 :(得分:0)
为此目的,您需要存储所有先前生成的数字,而不仅仅是一个,就像您在OldValue命名变量中所做的那样。所以,将所有先前生成的数字存储在某处(列表)。并将新生成的数字与列表中的所有数字进行比较,在循环中进行比较,并保持生成数字,而数字不等于列表中的任何数字..
答案 3 :(得分: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