Saturday, November 27, 2010

How to shuffle array items using C#

Here is a simple code of method which shuffle array items:


static Random rng = new Random();

public void Randomize(IList list)
{

    for (int i = list.Count - 1; i > 0; i--)
    {
        int swapIndex = rng.Next(i + 1);
        if (swapIndex != i)
        {
            object tmp = list[swapIndex];
            list[swapIndex] = list[i];
            list[i] = tmp;
        }
    }
}

1 comment:

  1. I am using the Knuth-Fisher-Yates algorithm to display a shuffled array of string items on a windows form. I do not get any duplicates, which is what I was trying to achieve, however, it only spits out 12 of the 13 elements of the array. How can I get it to display all 13 elements of the array? Here is my code:

    private void FormBlue1_Load(object sender, EventArgs e)
    {
    // set the forms borderstyle
    this.FormBorderStyle = FormBorderStyle.Fixed3D;

    // create array of stationOneParts to display on form
    string[] stationOneParts = new string[13];
    stationOneParts[0] = "20-packing";
    stationOneParts[1] = "5269-stempad";
    stationOneParts[2] = "5112-freeze plug";
    stationOneParts[3] = "2644-o'ring";
    stationOneParts[4] = "5347-stem";
    stationOneParts[5] = "4350-top packing";
    stationOneParts[6] = "5084-3n1 body";
    stationOneParts[7] = "4472-packing washer";
    stationOneParts[8] = "3744-vr valve o'ring";
    stationOneParts[9] = "2061-packing spring";
    stationOneParts[10] = "2037-packing nut";
    stationOneParts[11] = "2015-latch ring";
    stationOneParts[12] = "stem assembly";

    Random parts = new Random();

    // loop through stationOneParts using a Swap method to shuffle
    labelBlueOne.Text = "\n";
    for (int i = stationOneParts.Length - 1; i > 0; i--)
    {
    int j = parts.Next(i + 1);
    Swap(ref stationOneParts[i], ref stationOneParts[j]);

    // display in a random order
    labelBlueOne.Text += stationOneParts[i] + "\n";
    }
    }

    private void Swap(ref string firstElement, ref string secondElement)
    {
    string temp = firstElement;
    firstElement = secondElement;
    secondElement = temp;
    }

    ReplyDelete