我正在尝试创建和应用程序,它将洗牌字符串数组并生成2个完全不同的版本,其中没有元素将彼此匹配 例如,初始数组是A,B,C,D,E,而混洗数组必须是B,D,E,A,C。
在我的情况下,当我将它们填充并尝试产生输出时,我得到了混洗数组,但它们彼此完全相同。看起来最后一个数组中的值会覆盖前一个数组中的值。
我试图保护他们,但我不知道该怎么做。请允许任何人给我一个关于我做错的提示吗?
Dim myArray() As String = {"A", "B", "C", "D", "E"}
这是触发随机播放的按钮代码
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
RendomOutput1(myArray)
End Sub
结束班
这是改组第一个数组的函数:
Sub RendomOutput1(ByVal x() As String)
Dim t As Integer
Dim Temp As String
For i As Integer = 0 To x.Count - 1
Dim rnd As New Random
t = rnd.Next(0, x.Count - 1)
Temp = x(t)
x(t) = x(i)
x(i) = Temp
Next
RandomOutput2(x)
End Sub
这是生成另一个数组并打印结果的函数:
Sub RendomOutput2(ByRef y() As String)
Dim y1() As String = y' May be I shall lock or somehow protect y1 here?
'Lock(y1) doesn't work
Dim t As Integer
Dim Temp As String
For i As Integer = 0 To y.Count - 1
Dim rnd As New Random
t = rnd.Next(0, y.Count - 1)
Temp = y(t)
y(t) = y(i)
y(i) = Temp
Next
For i As Integer = 0 To x.Count - 1
Label1.Text &= y1(i) & " IS NOT " & y(i) & vbCrLf
Next
End Sub
在结果数组中,y1和y与初始不同但彼此相同。有谁知道我怎么能让他们与众不同。可能会锁定y1数组或其他东西。提前谢谢
答案 0 :(得分:2)
这一行
Dim y1() As String = y
不会创建新数组 - 它会创建对现有数组的引用。因此,您将有两个数组引用(y
和y1
),但只有一个数组(两个引用都指向同一个数组)。当您对y
进行更改时,y1
可以看到这些更改,因为它们都引用了相同的基础数组。
你需要的是2个不同的数组实例,其中所保存的数据是重复的数组(也就是说,你需要2个指向2个不同数组的数组引用)。然后对一个数组所做的更改不会影响另一个数组。
例如:
' Create new array from the input array
Dim y1() As String = new String(y.Count-1){}
For i As Integer = 0 To y.Count-1
y1(i) = y(i)
Next i
或者,您只需clone数组:
Dim y1() As String = y.Clone()
在幕后,这会产生同样的结果。
答案 1 :(得分:0)
Herr是一个改组数组的简单程序:
Public Sub Shuffle(Of T)(ByRef A() As T)
Dim last As Integer = A.Length - 1
Dim B(last) As T
Dim done(last) As Byte
Dim r As New Random(My.Computer.Clock.TickCount)
Dim n As Integer
For i As Integer = 0 To last
Do
n = r.Next(last + 1)
Loop Until Not done(n)
done(n) = 1
B(i) = A(n)
Next
A = B
End Sub
请注意,某些元素可能会偶然保留在原始索引处。