如何在VB中混乱数组?

时间:2014-05-10 02:25:28

标签: vb.net

我正在尝试创建和应用程序,它将洗牌字符串数组并生成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数组或其他东西。提前谢谢

2 个答案:

答案 0 :(得分:2)

这一行

Dim y1() As String = y

不会创建新数组 - 它会创建对现有数组的引用。因此,您将有两个数组引用(yy1),但只有一个数组(两个引用都指向同一个数组)。当您对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

请注意,某些元素可能会偶然保留在原始索引处。