Vb.net 如何在VB中洗牌数组?

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"} 这是触发随机播放的按钮

我正在尝试创建一个新的应用程序,它将洗牌一个字符串数组,并生成两个完全不同的版本,其中没有元素会相互匹配 例如,初始数组是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阵列或其他什么。提前谢谢你这一行

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是的,您必须手动将项目从一个数组复制到另一个数组。请看答案中的更新。啊,好的。我懂了。非常感谢你。它解决了这个问题