Shuffle an Array or a List in Java

How can we rearrange an array of items in random order? A simple way is to manipulate the array by picking elements randomly. Or we can use Java Collections API.

Shuffle an Array

Write a loop to go through each position, and assign it with a randomly chosen element. This method runs in linear time.

public static void shuffle(int[] a)
{
    int n = a.length;
    for (int i = 0; i < n; i++)
    {
        // between i and n-1
        int r = i + (int) (Math.random() * (n-i));
        int tmp = a[i];    // swap
        a[i] = a[r];
        a[r] = tmp;
    }
}

...
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
shuffle(a);
System.out.println(Arrays.toString(a));

Use java.util.Collection.shuffle()

Java Collections API provides a static method in the Collection class for shuffling.

public static void shuffle(List<?> list)

Similarly as the approach above, this implementation traverses the list backwards, from the last element up to the second, repeatedly swapping a randomly selected element into the “current position”. Elements are randomly selected from the portion of the list that runs from the first element to the current position, inclusive.

To use it, we need to have a List object.

Integer[] a = new Integer[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
// int[] does not work
Collections.shuffle(Arrays.asList(a));

The method Arrays.asList() returns a fixed-size list backed by the specified array.

Comments

comments