Vb.net 如何在VB中洗牌数组?
我正在尝试创建一个新的应用程序,它将洗牌一个字符串数组,并生成两个完全不同的版本,其中没有元素会相互匹配 例如,初始数组是A、B、C、D、E,而洗牌数组必须是B、D、E、A、C 在我的例子中,当我将它们淹没并试图产生一个输出时,我得到了洗牌数组,但它们彼此完全相同。最后一个数组中的值似乎覆盖了前一个数组中的值 我试图保护他们,但我不知道怎么做。谁能告诉我我做错了什么Vb.net 如何在VB中洗牌数组?,vb.net,Vb.net,我正在尝试创建一个新的应用程序,它将洗牌一个字符串数组,并生成两个完全不同的版本,其中没有元素会相互匹配 例如,初始数组是A、B、C、D、E,而洗牌数组必须是B、D、E、A、C 在我的例子中,当我将它们淹没并试图产生一个输出时,我得到了洗牌数组,但它们彼此完全相同。最后一个数组中的值似乎覆盖了前一个数组中的值 我试图保护他们,但我不知道怎么做。谁能告诉我我做错了什么 Dim myArray() As String = {"A", "B", "C", "D", "E"} 这是触发随机播放的按钮
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阵列或其他什么。提前谢谢你这一行
Dim y1() As String = y
不创建新数组-它创建对现有数组的引用。因此,您将有两个数组引用(y
和y1
),但只有一个数组(两个引用都指向同一个数组)。当您更改y
时,这些更改通过y1
可见,因为它们都引用相同的基础数组
您需要的是两个不同的数组实例,其中保存的数据是重复的(也就是说,您需要两个指向两个不同数组的数组引用)。然后对一个数组所做的更改不会影响另一个数组
例如:
' 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
或者,您也可以仅对阵列执行以下操作:
Dim y1() As String = y.Clone()
在幕后,这会产生同样的结果。这里有一个简单的例程,用于洗牌任何数组:
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
请注意,某些元素可能会碰巧保持在其原始索引 如果thero仅仅是一种保护“y1”数组的方法,我想问题将得到解决。我如何将一个数组的内容传递给另一个数组?我是否必须使用循环或其他方法?那么如何执行xxbbcc?@meks是的,您必须手动将项目从一个数组复制到另一个数组。请看答案中的更新。啊,好的。我懂了。非常感谢你。它解决了这个问题