meks
meks

Reputation: 807

how to shuffle array in VB?

I'm trying to create and application which will shuffle an string array and produce 2 totally different versions where no element will match each other like for example the initial array is A, B, C, D, E than the shuffled array must be B, D, E, A, C.

In my case when I suffle them and try to produce an output I get shuffled array but they are completely identical to each other. It seems like the values in last array override the values of the previous ones.

I tried to protect them but I don't know how to do it. Please can anybody give me a hint about what am I doing wrong?

Dim myArray() As String = {"A", "B", "C", "D", "E"} 

This is the code of the button which triggers shuffle

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    RendomOutput1(myArray)
End Sub

End Class

THis is the function that shuffles first array:

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

This is the function which produces another array and prints the result:

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

IN the result arrays y1 and y are different from initial but identical to each other. Does anybody know how can I make them different. Probably lock y1 array or something. Thank you in advance

Upvotes: 1

Views: 6233

Answers (2)

Spiritman
Spiritman

Reputation: 1

Here's a simple routine for shuffling any array:

  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

Note that some elements could remain at their original index by chance.

Upvotes: 0

xxbbcc
xxbbcc

Reputation: 17327

This line

Dim y1() As String = y

doesn't create a new array - it creates a reference to an existing array. So you'll have two array references (y and y1) but only one array (both references point to the same array). When you make changes to y those changes are visible through y1 because both of them refer to the same underlying array.

What you need is 2 distinct array instances where the data held be the arrays are duplicated (that is, you need 2 array references that point to 2 different arrays). Then changes made to one array will not affect the other array.

For example:

' 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

Alternatively, you can just clone the array:

Dim y1() As String = y.Clone()

Behind the scenes this results in the same thing.

Upvotes: 2

Related Questions