C++
--
    #include <cstdlib>
    #include <ctime>
    #include <iostream>

    int deck[52];

    void swap(int a, int b) {
        deck[a] ^= deck[b];
        deck[b] ^= deck[a];
        deck[a] ^= deck[b];
    }

    int r(int a, int b) {
        return a + (rand() % (b - a + 1));
    }

    void s(int *deck) {
        swap(1, r(2, 51));
        deck[0] *= 100;

        for(deck[0] += 2; (deck[0] % 100) < 51; deck[0]++) {
            swap(deck[0] % 100,
              r(0, 1) ? r(1, (deck[0] % 100) - 1) : r((deck[0] % 100) + 1, 51));
        }
        swap(51, r(1, 50)); 

        deck[0] = (deck[0] - 51) / 100;
        swap(r(1, 51), 0);
    }

    int main(int a, char** c)
    {
        srand(time(0));
        
        for (int i = 0; i < 52; i++)
            deck[i] = i;

        s(deck);
        s(deck);

        for (int i = 0; i < 52; i++)
            std::cout << deck[i] << " ";
    }

Avoids swapping elements with themselves, so has to call twice to be random.