1

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

1
  • If thero only will be a way how to protect 'y1' array i think the problem would be solved Commented May 10, 2014 at 2:34

2 Answers 2

2

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.

Sign up to request clarification or add additional context in comments.

4 Comments

so how can I pass the content of one array to another?
DO I have to youse for loop or something?
so how to do it xxbbcc?
@meks Yes, you have to manually copy items from one array to the other. See the update in the answer.
0

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.