## Java I am surprised nobody stated the obvious: (I'll assume swap(x,x) does nothing) static void shuffle(){ swap(1,rand(0,1)); swap(2,rand(0,2)); swap(3,rand(0,3)); swap(4,rand(0,4)); swap(5,rand(0,5)); swap(6,rand(0,6)); swap(7,rand(0,7)); swap(8,rand(0,8)); swap(9,rand(0,9)); swap(10,rand(0,10)); swap(11,rand(0,11)); swap(12,rand(0,12)); swap(13,rand(0,13)); swap(14,rand(0,14)); swap(15,rand(0,15)); swap(16,rand(0,16)); swap(17,rand(0,17)); swap(18,rand(0,18)); swap(19,rand(0,19)); swap(20,rand(0,20)); swap(21,rand(0,21)); swap(22,rand(0,22)); swap(23,rand(0,23)); swap(24,rand(0,24)); swap(25,rand(0,25)); swap(26,rand(0,26)); swap(27,rand(0,27)); swap(28,rand(0,28)); swap(29,rand(0,29)); swap(30,rand(0,30)); swap(31,rand(0,31)); swap(32,rand(0,32)); swap(33,rand(0,33)); swap(34,rand(0,34)); swap(35,rand(0,35)); swap(36,rand(0,36)); swap(37,rand(0,37)); swap(38,rand(0,38)); swap(39,rand(0,39)); swap(40,rand(0,40)); swap(41,rand(0,41)); swap(42,rand(0,42)); swap(43,rand(0,43)); swap(44,rand(0,44)); swap(45,rand(0,45)); swap(46,rand(0,46)); swap(47,rand(0,47)); swap(48,rand(0,48)); swap(49,rand(0,49)); swap(50,rand(0,50)); swap(51,rand(0,51)); } OK, ok, it can be shorter: package stackexchange; import java.util.Arrays; public class ShuffleDry { static int[] deck = new int[52]; static void swap(int i, int j){ int t=deck[i]; deck[i] = deck[j]; deck[j] = t; } static int rand(int min, int max){ return (int)Math.floor(Math.random()*(max-min+1))+min; } static void initialize(){ for( int i=0 ; i<deck.length ; i++ ){ deck[i] = i; swap(i,rand(0,i)); } } static void shuffle(){ while( deck[0]!=0 ) swap(0,deck[0]); for( deck[0]=52; deck[0]-->1 ; ) swap(deck[0],rand(deck[0],51)); swap(0,rand(0,51)); } public static void main(String[] args) { initialize(); System.out.println("init: " + Arrays.toString(deck)); shuffle(); System.out.println("rand: " + Arrays.toString(deck)); } } PS: oops, the XOR swap algorithm won't like it. I'll correct that shortly.